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

时间:2010-10-23 01:15:16

标签: python regex

我正在逐行搜索文件,发现## random_string ##。它适用于多个#...

的情况
pattern='##(.*?)##'
prog=re.compile(pattern)

string='lala ###hey## there'
result=prog.search(string)

print re.sub(result.group(1), 'FOUND', string)

期望的输出:

"lala #FOUND there"

相反,我得到以下内容,因为它抓住了整个###嘿##:

"lala FOUND there"

那么如何在开头或结尾忽略任意数量的#,只捕获“## string ##”。

7 个答案:

答案 0 :(得分:3)

要在两端匹配至少两个哈希值:

pattern='##+(.*?)##+'

答案 1 :(得分:3)

你的问题在于内心的匹配。您使用.,它匹配任何字符,而不是行结尾,这意味着它也匹配#。因此,当它获得###hey##时,它会将(.*?)#hey匹配。

简单的解决方案是从匹配集中排除#字符:

prog = re.compile(r'##([^#]*)##')

Protip:对正则表达式使用原始字符串(例如r''),这样你就不必为反斜杠转义而疯狂。

尝试在哈希中允许#会使更多更复杂。

编辑:如果您不想允许空白内部文本(即“####”不应与“”的内部文本匹配),请将其更改为:

prog = re.compile(r'##([^#]+)##')

+表示“一个或多个。”

答案 2 :(得分:1)

'^#{2,}([^#]*)#{2,}' - 两端的任意数量的#> = 2

要小心使用像(。*?)这样的惰性量词,因为它匹配'## abc #####'并捕获'abc ###'。懒惰的量词也很慢

答案 3 :(得分:0)

尝试“阻止评论技巧”:/##((?:[^#]|#[^#])+?)##/ Screenshot of working example

答案 4 :(得分:0)

将+添加到正则表达式,这意味着匹配一个或多个字符。

pattern='#+(.*?)#+'
prog=re.compile(pattern)

string='###HEY##'
result=prog.search(string)
print result.group(1)

输出:

HEY

答案 5 :(得分:0)

您是否考虑过采用非正则表达方式?

>>> string='lala ####hey## there'
>>> string.split("####")[1].split("#")[0]
'hey'

答案 6 :(得分:0)

>>> import re
>>> text= 'lala ###hey## there'
>>> matcher= re.compile(r"##[^#]+##")
>>> print matcher.sub("FOUND", text)
lala #FOUND there
>>>