2015-11-13 3 views
-1

нужна регулярное выражение о том, что находит скобки и цифры после нихPython - Regex - скобка и заглавные буквы

'Hello(World)55Example(Text)23Something' 

в

['(World)55','(Text)23'] 

с помощью питона

matchs = re.findall(*STATEMENT*, 'Hello(World)55Example(Text)23Something') 

ближайшей вещи я имеют

'(.*?)[A-Z]' 

и что не правильно соответствует

Также необходимо разделить слова между скобкой и чисел Кэпиталз

+1

только неизвестно, что в настоящее время, является ли у вас также есть вход как ' 'Hello (Hello, World (s)) 55Example (Text (и здесь) более текст) 23Something''. –

ответ

3

Вы должны избежать скобки, а также определить шаблон рядом с bracktes в-целях соответствуют одной или нескольким цифрам. [A-Z] не соответствует символам цифр, он соответствует только прописным буквам. (, ) - специальные метасимволы в регулярном выражении, которые представляют начало ( и конец ) группы захвата.

matchs = re.findall(r'\([^()]*\)\d+', 'Hello(World)55Example(Text)23Something') 

[^()]* инвертированный класс символ, который соответствует любому символу, но не ( или ), ноль или более раз. .*? Нежелательная форма, которая останавливается, если находит совпадение.

Пример:

>>> import re 
>>> re.findall(r'\([^()]*\)\d+', 'Hello(World)55Example(Text)23Something') 
['(World)55', '(Text)23'] 
>>> re.findall(r'\(.*?\)\d+', 'Hello(World)55Example(Text)23Something') 
['(World)55', '(Text)23'] 

Update:

>>> re.findall(r'\(.*?\)\d+|\w+', 'Hello(World)55Example(Text)23Something') 
['Hello', '(World)55', 'Example', '(Text)23', 'Something'] 
+0

Я собирался быстро отредактировать вопрос, потому что я что-то забыл, но вы уже правильно ответили ... может ли выражение выводить слова между сломанными капителями, поэтому Hello (World) 55ExampleTest (Text) 23 превращается в ['Hello', ' (World) 55 ',' Example ',' Test ',' (Text) 23 '] или мне нужно, чтобы какая-то другая логика python работала над этим – eatingcereal

+0

@Hooner ok, что бы вы сделали? –

+0

см. Мое обновление ........ –

2

Проблема с вашим утверждением, что () специальные термины, что группа все термины перед числами [.*?], и вы» после этого не группировали числа. Следовательно, вам нужно сбежать из скобок, используя \, а затем сгруппировать все цифры (\d+) после него. Я считаю, что все, что вам нужно:

>>> import re 
>>> matchs = re.findall(r'(\(.*?\)\d+)', 'Hello(World)55Example(Text)23Something') 
>>> print matchs 
['(World)55', '(Text)23'] 
+0

Вместо'. *? 'Вам лучше использовать развернутый' [^)] * (?: \) (?! \ D) [^)] *) * '. –

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