2010-10-23 307 views
0

我正在逐行搜索一个文件,以查找## random_string ##的出现。它的工作原理除了多个#的情况下...Python正则表达式匹配:## ##

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 ##”。

+0

请小心使用像'(。*?)'这样的惰性量词,因为它会匹配'## abC#####'并捕获'abC###'。还有懒惰的量词很慢。 – glebm 2010-10-23 01:20:18

回答

3

要在两端匹配至少两个散列:

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

即时对不起,我说我的问题很糟糕。我想匹配确切地 ## ##并忽略其他###在乞讨或结束(即时调用re.sub,它会搅乱我的结果)。 – nubme 2010-10-23 01:38:52

+0

@nubme:我不确定你的意思。这正是我的答案。我只是测试它,并确认它输出'hey',并且只有当字符串在每一端至少有两个'#'字符时才会匹配。 – 2010-10-23 01:43:32

+0

@marcelo:对不起,我编辑了我的问题,看看它现在是否更有意义。 – nubme 2010-10-23 01:49:30

1

'^#{2,}([^#]*)#{2,}' - 在任一端

任何数量的#> = 2小心使用懒惰量词等,因为它会匹配 '## ABC#####' 和捕获(*?) 'ABC###'。也懒的量词是非常慢的

+0

我认为他在开始*和*结束时至少需要2个。 – 2010-10-23 01:21:51

+0

编辑,谢谢 – glebm 2010-10-23 01:22:57

0

尝试“块注释绝招”:/##((?:[^#]|#[^#])+?)##/ Screenshot of working example

0

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

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

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

输出:

HEY 
0

你有没有考虑做非正则表达式的方式?

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

你的问题与你的内心匹配。您使用.,它与任何字符不匹配,并且这意味着它也匹配#。所以当它得到###hey##时,它匹配(.*?)#hey

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

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

普罗蒂普:对正则表达式使用原始字符串(例如r''),所以你不必用反斜杠发疯。

试图允许#内部的哈希将使事情更复杂。

编辑:如果您不希望允许空白内部文本(即“####”不应该的“”内文匹配),然后将其更改为:

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

+表示“一个或多个”。

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