Я пытаюсь совместить термины, которые выглядят как:
abcd[_stringiwant_]efgh
и
abcd[_string_i_want_]efgh
Я могу выполнить первое выражение с помощью
re.compile('\[_[^\[\]_]*_\]');
но это не позволяет захватить строку для второго выражения. У кого-нибудь есть предложения регулярного выражения, которое работает для обоих?
re.compile('\[([^\]]+)\]')
Это должно сработать. Не уверен ни о чем Python, что вам нужно сделать, но это выражение будет захватывать любую строку между [и]
Дэвид регулярное выражение должно работать, но я предпочитаю
re.compile(r'\[(.+?)\]')
для удобства чтения. +?
является неживым модификатором, то есть он будет захватывать наименьшее количество символов, то есть он будет захватывать все символы до первого ]
.
Я думаю, вы хотите, чтобы:
text = '''zza [_stringiwant_] cododo
21321324654654654
aaaaaaaaaa [stringiDONTwant_] bbb
cccc[stringiDONTwantnomore]ddddd
hghghg [_string_i_want_] lumulu
321321
rrree [_out of need] kjhfkhfg'''
import re
regx = re.compile('(?<=\[_).+?(?=_\])')
print regx.findall(text)
результат
['stringiwant', 'string_i_want']
Я думаю, мне нужно немного больше информации, но я сделаю удар в темноте и скажу, что вы, вероятно, используете поиск, когда действительно хотите найти. Кроме того, ваше регулярное выражение не совсем правильно в соответствии с тем, что вы описали (почему подчеркивает? Вы хотите, чтобы он возвращал пустые строки? Если нет, то не используйте *, используйте +). Попробуйте следующее:
searcher = re.compile(r'\[([^\]]+)\]')
list_of_results = searcher.findall(string_to_search)
r'\[([^\]]+)\]'
). Это спасает вас от уродливых вещей \ ":)