[英]Python Regular Expression Matching: ## ##
我正在逐行搜索文件中是否出現## 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"
相反,我得到以下內容,因為它抓住了整個### hey ##:
"lala FOUND there"
因此,我將如何忽略開頭或結尾的任意數量的#,而僅捕獲“ ## string ##”。
至少在兩端匹配至少兩個哈希:
pattern='##+(.*?)##+'
你的問題在於你的內心匹配。 您使用.
,它匹配不是行尾的任何字符,這意味着它也匹配#
。 因此,當它得到###hey##
,它將(.*?)
與#hey
。
一個簡單的解決方案是從可匹配的集合中排除#
字符:
prog = re.compile(r'##([^#]*)##')
提示:對正則表達式使用原始字符串(例如r''
),這樣就不必擔心反斜杠轉義。
試圖讓#
進入哈希值將使事情變得更加復雜。
編輯:如果您不想允許內部文本為空白(即“ ####”不應與內部文本“”匹配),則將其更改為:
prog = re.compile(r'##([^#]+)##')
+
表示“一個或多個”。
'^#{2,}([^#]*)#{2,}'
-兩端任意數量的#> = 2
請謹慎使用(。*?)之類的惰性量詞,因為它會匹配“ ## abc #####”並捕獲“ abc ###”。 懶惰的量詞也很慢
嘗試“阻止注釋技巧”: /##((?:[^#]|#[^#])+?)##/
在正則表達式中添加+,表示匹配一個或多個字符。
pattern='#+(.*?)#+'
prog=re.compile(pattern)
string='###HEY##'
result=prog.search(string)
print result.group(1)
輸出:
HEY
您是否考慮過采用非正則表達式的方式?
>>> string='lala ####hey## there'
>>> string.split("####")[1].split("#")[0]
'hey'
>>> import re
>>> text= 'lala ###hey## there'
>>> matcher= re.compile(r"##[^#]+##")
>>> print matcher.sub("FOUND", text)
lala #FOUND there
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.