我是python和正则表达式的新手。我一行一行地搜索文件,发现## random_string ##,我希望能够在## s之间捕获random_string。
我尝试了两种模式,但没有运气= /
pattern1=r'[##]()[##]'
pattern2=r'\#{2}()\#{2}'
prog=re.compile(pattern1)
result=prog1.search(line)
if result:
print result.group(0)
感谢您的帮助=]
答案 0 :(得分:6)
尝试使用:
'##(.*?)##'
正则表达式的问题在于您尝试使用##
匹配()
之间的空字符串,您应该使用.*?
来匹配任何内容或{{1匹配任何非空的东西。
您的第一个正则表达式.+?
还有一个错误。字符类匹配单个字符,例如:[##]()[##]
匹配[ab]
或a
,但不匹配两者。
因此b
与[##]
不匹配实际上,在字符类中包含重复字符是多余的,因此##
与[##]
相同,与[#]
相同。
你的第二个正则表达式#
几乎是正确的,但对于空匹配的东西。另请注意,'\#{2}()\#{2}'
不是元字符(例如#
,.
,+
),因此您需要不转义它。因此,您可以将*
放入\
,但是
答案 1 :(得分:0)
你的小组是空的。
'##(.+?)##'
答案 2 :(得分:0)
或者:
'##([^#]*)##'
(未经测试)
答案 3 :(得分:0)
如果您的专线有多个##()##
,那么您的输出是多少?即,如果模式重叠并且您想获得那些重叠
>>> line="blah ## i want 1 ## blah blah ## i want 2 ## blah"
>>> line.split("##")[1:-1]
[' i want 1 ', ' blah blah ', ' i want 2 ']
>>> line="blah ## i want 1 ## blah"
>>> line.split("##")[1:-1]
[' i want 1 ']
>>> line="blah ## i want 1 ## blah ## "
>>> line.split("##")[1:-1]
[' i want 1 ', ' blah ']
>>>
如果您不想重叠,
>>> line="blah ## i want 1 ## blah ## i want ## "
>>> [i for n,i in enumerate(line.split("##")[1:]) if n%2==0]
[' i want 1 ', ' i want ']
>>> line="blah ## i want 1 ## blah "
>>> [i for n,i in enumerate(line.split("##")[1:]) if n%2==0]
[' i want 1 ']
>>> line="blah ## i want 1 ## blah ## iwant2 ## junk ## i want 3 ## ..."
>>> [i for n,i in enumerate(line.split("##")[1:]) if n%2==0]
[' i want 1 ', ' iwant2 ', ' i want 3 ']
>>>