Как попытаться преобразовать строку в Guid [дубликат]

Как сообщается Азиз Альто filter(None, lstr) не удаляет пустые строки с пространством ' ', но если вы уверены, что lstr содержит только строку, вы можете использовать filter(str.strip, lstr)

>>> lstr = ['hello', '', ' ', 'world', ' ']
>>> lstr
['hello', '', ' ', 'world', ' ']
>>> ' '.join(lstr).split()
['hello', 'world']
>>> filter(str.strip, lstr)
['hello', 'world']

Сравнить время на моем компьютере

>>> from timeit import timeit
>>> timeit('" ".join(lstr).split()', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
3.356455087661743
>>> timeit('filter(str.strip, lstr)', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
5.276503801345825

Самое быстрое решение для удаления '' и пустых строк с пробелом ' ' остается ' '.join(lstr).split().

Как сообщалось в комментарии ситуация другая, если ваши строки содержат пробелы.

>>> lstr = ['hello', '', ' ', 'world', '    ', 'see you']
>>> lstr
['hello', '', ' ', 'world', '    ', 'see you']
>>> ' '.join(lstr).split()
['hello', 'world', 'see', 'you']
>>> filter(str.strip, lstr)
['hello', 'world', 'see you']

Вы можете видеть, что filter(str.strip, lstr) сохраняет строки с пробелами на нем, но ' '.join(lstr).split() разделит эти строки.

147
задан leppie 28 September 2017 в 23:21
поделиться

4 ответа

new Guid(string)

Вы могли также посмотреть на использование TypeConverter.

274
ответ дан leppie 28 September 2017 в 23:21
поделиться

Это получит Вас достаточно близкий, и я использую его в производстве и никогда не имел коллизии. Однако при рассмотрении конструктора для гуида в отражателе Вы будете видеть все проверки, которые он осуществляет.

 public static bool GuidTryParse(string s, out Guid result)
    {
        if (!String.IsNullOrEmpty(s) && guidRegEx.IsMatch(s))
        {
            result = new Guid(s);
            return true;
        }

        result = default(Guid);
        return false;
    }

    static Regex guidRegEx = new Regex("^[A-Fa-f0-9]{32}$|" +
                          "^({|\\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\\))?$|" +
                          "^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$", RegexOptions.Compiled);
7
ответ дан Brian Rudolph 28 September 2017 в 23:21
поделиться

К сожалению, нет TryParse () эквивалентен. Если Вы создаете новый экземпляр Системы. Гуид и передача строковое значение в, можно поймать три возможных исключения, которые это выдало бы, если это недопустимо.

Те:

  • ArgumentNullException
  • FormatException
  • OverflowException

я видел некоторые реализации, где можно сделать regex на строке до создания экземпляра, если Вы просто пытаетесь проверить его и не создать его.

3
ответ дан Joseph Ferris 28 September 2017 в 23:21
поделиться

Если все, что вам нужно, это простейшая проверка ошибок, вы можете просто проверить длину строки.

              string guidStr = "";
              if( guidStr.Length == Guid.Empty.ToString().Length )
                 Guid g = new Guid( guidStr );
0
ответ дан 23 November 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: