簡體   English   中英

使用$進行Python正則表達式匹配

[英]Python regular expression matching using $

我正在使用Python 2.7.0並在解釋器中執行以下操作:

>>> re.search (r"//\s*.*?$", "//\n\na12345678", flags=re.MULTILINE|re.DOTALL).group()
'//\n\na12345678'

這不是我的預期。 我雖然$會在結束前匹配,但它包含了兩個結束字符和文本之后?

令人驚訝的是,這有效:

>>> re.search (r"//\s*.*?$", "//1\n\na12345678", flags=re.MULTILINE|re.DOTALL).group()
'//1'

我在這里對python正則表達式有什么誤解?

更多信息:

>>> re.search(r"//\s*.*", "//\n  test").group()
'//\n  test'
>>> re.search(r"//\s*.*", "//1\n  test").group()
'//1'

最后一段代碼沒有MUTLILINE和DOTALL? 我在這里誤解了什么? 。*不應該與換行符匹配,絕對不能過去吧,對吧?

\\s可以匹配換行符,當您使用re.DOTALL標志時. 也可以匹配換行符。

在第一種情況下你的\\s*是貪婪的,所以因為你的字符串中//之后的第一個字符是換行符,它們將被\\s*匹配,然后是.*? 將匹配最后一行,以便$可以在字符串的最后匹配。

在第二種情況下, \\s*無法匹配,因為//后面的1.*? 只會在第一個換行符之前匹配,因為它是懶惰的。

如果要匹配除換行符之外的所有空格,可以使用[ \\t]代替\\s 實際上,對於你的例子來說,如果你只是在啟用了re.MULTILINE標志的情況下使用正則表達式//.*?$ ,那么你將獲得預期的行為( re.DOTALL也可以包括在內,它不會對此產生影響)案件)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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