Как использовать регулярное выражение для разделения чисел и символов в строках типа «30M1000N20M»

Я пытаюсь отделить [0-9] и [AZ] в строках, подобных этим:

 100M 20M1D80M 20M1I79M 20M10000N80M 

Я попытался использовать модуль Python re , и следующий код, который я использовал:

 >>>import re >>>num_alpha = re.compile('(([0-9]+)([AZ]))+') >>>str1="100M" >>>n_a_match = num_alpha.match(str1) >>>n_a_match.group(2), n_a_match.group(3) 100,M #just what I want >>>str1="20M10000N80M" >>>n_a_match = num_alpha.match(str1) >>>n_a_match.groups() ('80M', '80', 'M') #only the last one, how can I get the first two? #expected result ('20M','20','M','10000N','10000','N','80M','80','M') 

Это регулярное выражение хорошо работает для строк, которые содержат только одно совпадение, но не несколько групп совпадений. Как я могу справиться с этим, используя регулярные выражения?

3 Solutions collect form web for “Как использовать регулярное выражение для разделения чисел и символов в строках типа «30M1000N20M»”

Я предлагаю использовать re.findall . Если вы собираетесь перебирать результаты, а не re.finditer список, вместо этого вы можете использовать re.finditer . Вот пример того, как это будет работать:

 >>> re.findall("(([0-9]+)([AZ]))", "20M10000N80M") [('20M', '20', 'M'), ('10000N', '10000', 'N'), ('80M', '80', 'M')] 

Если вы не хотите, чтобы строка с комбинированными номерами + буквы, вы можете удалить внешние скобки из совпадения и просто получить отдельные части:

 >>> re.findall("([0-9]+)([AZ])", "20M10000N80M") [('20', 'M'), ('10000', 'N'), ('80', 'M')] 

Или, если вы не хотите кортежей вообще (и вам не нужно беспокоиться о некорректном вводе, например, строки с несколькими буквами подряд), вы можете изменить шаблон на чередование и получить значения один за один:

 >>> re.findall("([0-9]+|[AZ])", "20M10000N80M") ['20', 'M', '10000', 'N', '80', 'M'] 

Попробуйте использовать метод split :

 >>> str1="20M10000N80M" >>> num_alpha = re.compile('(([0-9]+)([AZ]))') >>> l = num_alpha.split(str1) >>> l ['', '20M', '20', 'M', '', '10000N', '10000', 'N', '', '80M', '80', 'M', ''] 

Обратите внимание, что я удалил + в регулярном выражении.

И чтобы удалить пустые строки, генератор списка:

 >>> l_without_empty = [x for x in l if x != ''] ['20M', '20', 'M', '10000N', '10000', 'N', '80M', '80', 'M'] 

Редактировать:

Или, как сказано в комментариях:

 >>> l_without_empty = [x for x in l if x] ['20M', '20', 'M', '10000N', '10000', 'N', '80M', '80', 'M'] 

Другой альтернативой является re.findall на re.findall :

 >>> string = "20M10000N80M" >>> groups = re.findall(r'((\d+)(\D+))', string) [('20M', '20', 'M'), ('10000N', '10000', 'N'), ('80M', '80', 'M')] 

Таким образом, вы можете видеть разные группы, возвращаемые в виде кортежей, тогда, если вы действительно хотите, чтобы это был кортеж, который вы представляете, вы можете сгладить его:

 >>> from itertools import chain >>> tuple(chain.from_iterable(groups)) ('20M', '20', 'M', '10000N', '10000', 'N', '80M', '80', 'M') 
  • IPv6 regexp python
  • Как извлечь плавающее число из строки
  • Как создать правило LinkExtractor, основанное на href в Scrapy
  • Как эффективно отобразить последовательность изображений? Сравнение цифровых последовательностей в Python
  • Как вывести фрагменты NLTK в файл?
  • Как отделить выходные данные
  • Красивый суп с использованием регулярных выражений для поиска тегов?
  • Повторное выражение поиска Python из переменной внутри списка
  • Python - лучший язык программирования в мире.