我正在逐行搜索文件,发现## 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 ##”。
答案 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)
尝试“阻止评论技巧”:/##((?:[^#]|#[^#])+?)##/
答案 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
>>>