簡體   English   中英

正則表達式模式有疑問嗎?

[英]Regular expression pattern questions?

我很難理解正則表達式模式。 有人可以幫助我使用正則表達式模式來匹配所有以s結尾的單詞。 並以a開頭,以a結束(例如ana)。 如何寫結局?

單詞邊界由\\b給出,因此以下正則表達式匹配以ing或s結尾的單詞: "\\b(\\w+?(?:ing|s))\\b"其中\\b是單詞邊界, \\w+是一個或更多的“單詞字符”和(?:ing|s)ings未捕獲組。

如您所問“如何開發正則表達式”:

第一:不要將正則表達式用於復雜的任務。 它們很難閱讀,編寫和維護。 例如,有一個用於驗證電子郵件地址的正則表達式 -但是它是計算機生成的,實際上您不應使用。

從簡單開始並添加邊緣案例。 在開始計划時,您需要使用哪些字符:您說您需要以sing結尾s單詞。 因此,您可能需要一些東西來表示一個單詞,單詞的結尾以及文字字符sing 什么字 這可能因大小寫而異,但至少每個字母字符都不同。 在正則表達式python文檔中查找,您可以找到\\w ,它是[a-zA-Z0-9_] ,適合我對單詞字符的印象。 在這里您還可以找到\\b ,它是單詞邊界。

因此,“第一個偽代碼嘗試”類似於\\b\\w...\\w\\b ,它與一個單詞匹配。 我們仍然需要“形式化” ... ,我們要具有“一個或多個字符”的含義,它直接轉換為\\b\\w+\\b 我們現在可以匹配一個單詞! 我們仍然需要sing | 轉換為或,則以下內容如何: \\b\\w+ing|s\\b 如果您對此進行測試,您會發現它可以匹配令人困惑的事情,例如ingest ,而這與我們的正則表達式不符。 怎么了? 您可能已經看到了| 無法知道“應該或應該的哪一部分”,因此我們需要引入括號: \\b\\w+(ing|s)\\b 恭喜,您現在可以使用正則表達式了!

為什么(和如何)與我首先給出的示例不同? 首先我寫了\\w+? 而不是\\w+ ? +變成非貪婪的版本。 如果您知道貪婪和非貪婪之間的區別,請跳過本段。 考慮以下內容: AaAAbA ,我們要匹配大字母A包圍A 天真的嘗試: A\\w+A ,所以用A括起來的一個或多個單詞字符。 AaAAbA匹配AaA ,也匹配AaAAbAA仍然可以由\\w匹配。 如果沒有進一步的配置, *+? 量詞都試圖盡可能地匹配。 有時,例如在A示例中,您不需要這樣做,則可以使用? 量詞表示您想要一個非貪婪的版本后,該版本應盡可能少地匹配。

但是在我們的情況下,這不是必需的,單詞之間用空格很好地分隔,空格不是\\w一部分。 因此,實際上,您可以讓+貪婪,一切都會好起來的。 如果使用. (任何字符),您通常需要注意不要太大的匹配。

另一個區別是使用(?:s|ing)而不是(s|ing) ?:這是?: 它將捕獲組更改為非捕獲組。 通常,您不希望從正則表達式中獲得“一切”。 考慮以下正則表達式: I want to go to \\w+ 您對整個句子不感興趣,只對\\w+感興趣,因此您可以將其捕獲為一個組: I want to go to (\\w+) 這意味着您對這條特定的信息感興趣,並希望稍后再檢索。 有時(例如使用| )您需要將表達式分組在一起,但對它們的內容不感興趣,然后可以將其聲明為非捕獲。 否則,您將得到組( sing ),但不是實際的單詞!

總結一下:*從小開始*逐個添加一個案例*總是用示例進行測試

實際上,我只是嘗試了re.findall( \\ b \\ w +(?: ing | s)\\ b , "fishing words") ,但是它沒有用。 \\w+(?:ing|s)有效。 我不知道為什么,也許別人可以解釋一下。 正則表達式是一個不可思議的東西,僅將它們用於簡單易用的測試任務。

一般來說,我會使用\\ b來將“單詞邊界”與匹配單詞組成部分的\\ w匹配([A-Za-z0-9_]的捷徑)。 然后,您可以進行“或”分組以匹配“ s”或“ ing”。 結果是:

/\b\w+(s|ing)\b/

暫無
暫無

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

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