[英]Regular expression pattern questions?
我很難理解正則表達式模式。 有人可以幫助我使用正則表達式模式來匹配所有以s結尾的單詞。 並以a開頭,以a結束(例如ana)。 如何寫結局?
單詞邊界由\\b
給出,因此以下正則表達式匹配以ing或s結尾的單詞: "\\b(\\w+?(?:ing|s))\\b"
其中\\b
是單詞邊界, \\w+
是一個或更多的“單詞字符”和(?:ing|s)
是ing
或s
未捕獲組。
如您所問“如何開發正則表達式”:
第一:不要將正則表達式用於復雜的任務。 它們很難閱讀,編寫和維護。 例如,有一個用於驗證電子郵件地址的正則表達式 -但是它是計算機生成的,實際上您不應使用。
從簡單開始並添加邊緣案例。 在開始計划時,您需要使用哪些字符:您說您需要以s
或ing
結尾s
單詞。 因此,您可能需要一些東西來表示一個單詞,單詞的結尾以及文字字符s
和ing
。 什么字 這可能因大小寫而異,但至少每個字母字符都不同。 在正則表達式的python文檔中查找,您可以找到\\w
,它是[a-zA-Z0-9_]
,適合我對單詞字符的印象。 在這里您還可以找到\\b
,它是單詞邊界。
因此,“第一個偽代碼嘗試”類似於\\b\\w...\\w\\b
,它與一個單詞匹配。 我們仍然需要“形式化” ...
,我們要具有“一個或多個字符”的含義,它直接轉換為\\b\\w+\\b
。 我們現在可以匹配一個單詞! 我們仍然需要s
或ing
。 |
轉換為或,則以下內容如何: \\b\\w+ing|s\\b
? 如果您對此進行測試,您會發現它可以匹配令人困惑的事情,例如ingest
,而這與我們的正則表達式不符。 怎么了? 您可能已經看到了|
無法知道“應該或應該的哪一部分”,因此我們需要引入括號: \\b\\w+(ing|s)\\b
。 恭喜,您現在可以使用正則表達式了!
為什么(和如何)與我首先給出的示例不同? 首先我寫了\\w+?
而不是\\w+
?
將+
變成非貪婪的版本。 如果您知道貪婪和非貪婪之間的區別,請跳過本段。 考慮以下內容: AaAAbA
,我們要匹配大字母A
包圍A
。 天真的嘗試: A\\w+A
,所以用A
括起來的一個或多個單詞字符。 這AaAAbA
匹配AaA
,也匹配AaAAbA
, A
仍然可以由\\w
匹配。 如果沒有進一步的配置, *+?
量詞都試圖盡可能地匹配。 有時,例如在A示例中,您不需要這樣做,則可以使用?
量詞表示您想要一個非貪婪的版本后,該版本應盡可能少地匹配。
但是在我們的情況下,這不是必需的,單詞之間用空格很好地分隔,空格不是\\w
一部分。 因此,實際上,您可以讓+
貪婪,一切都會好起來的。 如果使用.
(任何字符),您通常需要注意不要太大的匹配。
另一個區別是使用(?:s|ing)
而不是(s|ing)
。 ?:
這是?:
? 它將捕獲組更改為非捕獲組。 通常,您不希望從正則表達式中獲得“一切”。 考慮以下正則表達式: I want to go to \\w+
。 您對整個句子不感興趣,只對\\w+
感興趣,因此您可以將其捕獲為一個組: I want to go to (\\w+)
。 這意味着您對這條特定的信息感興趣,並希望稍后再檢索。 有時(例如使用|
)您需要將表達式分組在一起,但對它們的內容不感興趣,然后可以將其聲明為非捕獲。 否則,您將得到組( s
或ing
),但不是實際的單詞!
總結一下:*從小開始*逐個添加一個案例*總是用示例進行測試
實際上,我只是嘗試了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.