Python正则表达式匹配:## ##

时间:2010-10-22 05:02:35

标签: python regex

我是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)

感谢您的帮助=]

4 个答案:

答案 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 ']
>>>