2013-02-13 5 views
2

Я довольно новым в регулярных выражениях, и я столкнулся с проблемой, которую я не могу понять:Regex - Использование * с набором символов

Я пытаюсь соответствовать набору символов, которые начинаются с произвольное число символов AZ, 0-9 и _, которые могут необязательно сопровождаться числом, заключенным в один набор скобок, и могут быть отделены от исходной строки пробелом (или нет)

Примеры того, что это должно найти:

_ABCD1E 
_123FD(13) 
ABDF1G (2) 

Это мое текущее выражение регулярного выражения:

[A-Z_0-9]+\s*\({0,1}[\d]*\){0,1} 

Это находя все просто отлично, но проблема существует, если у меня есть следующие:

_ABCDE) 

Нужно только захватить _ABCDE, а не «)», но в настоящее время он захватывает «_ABCDE)»

Есть ли способ, которым я могу захватить (#), но не получить лишние символы, если весь шаблон не существует?

Если возможно, объясните синтаксис, как я пытаюсь узнать, а не просто получить ответ.

ОТВЕТ: Следующий код работает для того, что мне нужно было до сих пор:

[A-Z_0-9]+(\s*\([\d]+\)){0,1} 
# or, as has been mentioned, the above can be simplified 
# and cleaned up a bit to be 
[A-Z_0-9]+(\s*\(\d+\))? 
# The [] around \d are unnecessary and {0,1} is equivalent to ? 

Добавление круглых скобок вокруг (#) модель позволяет для использования? или {0,1} по всему шаблону. Я также изменил [\ d] * на [\ d] +, чтобы обеспечить хотя бы одно число внутри круглых скобок.

Спасибо за быстрые ответы, все!

+0

Am не ясно, о чем ваши требования является. Вы хотите разрешить '_ABCD1E' и' _123FD (13) 'и не разрешать' _ABCDE) '? Или вы хотите узнать, соответствует ли подстрока ввода условию? –

+0

Да, если есть круглые скобки, они должны быть окружены рядом. Он также должен избегать пробелов после начальной строки, если (#) не существует. – Austin

+0

не нужно помещать '\ d' внутри класса символов. и '{0,1}' эквивалентно '?' –

ответ

1

Ваше регулярное выражение говорит, что каждый парик (открытый & закрыт) может быть или не быть, НЕЗАВИСИМО. Вместо этого, вы должны сказать, что номер-вложенной в-круглые скобки могут или не могут быть там:

(\([\d]*\)){0,1} 

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

+3

'{0,1}' вместо этого можно заменить на '?'. –

+0

Не могли бы вы использовать [\ d] + для того, чтобы внутри было число? – Feles

+0

Ага! Это именно то, что я пытался сделать. Я попытался использовать [], чтобы окружить утверждение, но он явно не работал. Благодаря! EDIT: @Feles: я изменил * на + и, похоже, сейчас работает над моими испытаниями, поэтому я так думаю. – Austin

0

как о

^[A-Z0-9_]+\s*(\([0-9]+\))?$ 

BTV, из вашего примера, первая часть принимает не только [A-Z_], но и [0-9]

+0

Ах да, я сделал ошибку при копировании кода. Первая часть должна была быть [A-Z_0-9] – Austin

0

Это, кажется, чтобы сделать работу.

[1-9A-Z_]+\s*(?:\([1-9]*\))? 
0

Похоже, вы хотите следующее регулярное выражение:

^[A-Z\d_]+(\s*\(\d+\))?$ 
+0

Похоже на круглые скобки и? это то, что я пытался сделать. Благодаря! – Austin

0

я использовал, не захватывая группы, чтобы избежать группирования соответствия в результатах:

>>> pattern = r'[A-Z_]+\s*(?:\(\d+\)|\d*)' 
>>> l = ['_ABCD1E', '_123FD(13)', 'ABDF1G (2)', '_ABCDE)', 'A_B (15)', 'E (345'] 
>>> [re.search(pattern , i).group() for i in l] 
['_ABCD1', '_123', 'ABDF1', '_ABCDE ', 'A_B (15)', 'E '] 
Смежные вопросы