簡體   English   中英

Python正則表達式匹配:## ##

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM