2015-12-27 3 views
3

Я использую python и модуль re для синтаксического анализа некоторых строк и извлечения 4-значного кода, связанного с префиксом. Вот 2 примера строк я бы разобрать:python regex: группа захвата внутри OR

str1 = "random stuff tokenA1234 more stuff" 
str2 = "whatever here tokenB5678 tokenAand more there" 

tokenA и tokenB являются префиксы и 1234, 5678,являются цифры, мне нужно, чтобы захватить. токены A и B являются лишь примером. Префикс может быть чем-то вроде адреса http://domain.com/ (tokenA) или строки типа Id: ('[Ii]d:?\s?') (tokenB).

Моя регулярное выражение выглядит следующим образом:

re.findall('.*?(?:tokenA([0-9]{4})|tokenB([0-9]{4})).*?', str1) 

При разборе 2 строки выше, я получаю:

[('1234','')] 
[('','5678'),('0123','')] 

И я хотел бы, чтобы просто получить ['1234'] или ['5678','0123'] вместо кортежа. Как я могу изменить регулярное выражение для достижения этого? Заранее спасибо.

ответ

1

Вы получаете кортежи в результате, так как у вас есть более чем 1 группа записи в ваше регулярное выражение. См re.findall reference:

Если одна или несколько групп присутствуют в образце, возвращает список групп; это будет список кортежей, если шаблон имеет более одной группы.

Итак, решение использовать только одну группу захвата.

Поскольку у вас есть маркеры в вашем регулярном выражении, вы можете использовать их внутри группы. Поскольку только лексемы отличаются, ([0-9]{4}) часть является общим для обоих, просто использовать оператор чередования между маркерами положить в , не захватывая группы:

(?:tokenA|tokenB)([0-9]{4}) 
^^^^^^^^^^^^^^^^^ 

Регулярное выражение означает:

  • (?:tokenA|tokenB) - матч, но не захватить tokenA или tokenB
  • ([0-9]{4}) - спички и захватить в группу 1 четыре цифры

IDEONE demo:

import re 
s = "tokenA1234tokenB34567" 
print(re.findall(r'(?:tokenA|tokenB)([0-9]{4})', s)) 

Результат: ['1234', '3456']

1

Просто сделать это:

re.findall(r"token[AB](\d{4})", s) 

Поместите [AB] внутри класса символов, так что он будет соответствовать либо A или B

Смежные вопросы