[英]regex to get “words” containing letters and (numbers/certain special), but not only numbers
簡而言之:我想匹配包含1個字母和至少1個(數字/某些特殊字符)的任何“單詞”(由空格分隔的連續字符集)。 這些“單詞”可以出現在句子的任何地方。
嘗試在python
使用re
到目前為止,作為一種模式,我有:
\\w*[\\d@]\\w*
哪個在大多數情況下有效; 但是,我不想要只有數字/特殊的“單詞”。 例如:
應該匹配:
h1DF346
123FE453
3f3g6hj7j5v3
hasdf@asdf
r3
r@
不應該匹配:
555555
@
hello
onlyletters
排除前兩個“不應該匹配”的問題。 覺得這里有一些我很想念的東西。 謝謝!
我會用|
或像這樣的運算符:
([A-Za-z]+[\d@]+[\w@]*|[\d@]+[A-Za-z]+[\w@]*)
你想要的意思:
如果您正在使用正則表達式的其他部分中的組,請考慮使用非捕獲組(?:...)
而不是(...)
。
使用這樣的先行斷言。
正則表達式: (?=.*[a-zA-Z])(?=.*[@#\\d])[a-zA-Z\\d@#]+
說明:
(?=.*[a-zA-Z])
測試,如果something or not
之后是一個字母。
(?=.*[@#\\d])
測試,如果something or not
之后是從給定的字符類的一個字符。
[a-zA-Z\\d@#]+
匹配給定字符類中的一個或多個字符。
雖然你有答案,但你仍然可以提高接受的正則表達式的速度:
(?=\d++[A-Za-z]+[\w@]+|[a-zA-Z]++[\w@]+)[\w@]{2,}
你需要更新的regex
模塊:
import regex as re
string = "h1DF346 123FE453 3f3g6hj7j5v3 hasdf@asdf r3 r@ 555555 @ hello onlyletters"
rx = re.compile(r'(?=\d++[A-Za-z]+[\w@]+|[a-zA-Z]++[\w@]+)[\w@]{2,}')
print(rx.findall(string))
# ['h1DF346', '123FE453', '3f3g6hj7j5v3', 'hasdf@asdf', 'r3', 'r@']
劫持@Roberto的演示,你將大大減少尋找比賽所需的步驟(> 7000 vs 338,~20次)。
如果您僅為+(匹配1或更多)更改*(匹配0或更多),則可以正確地擊中所有內容。
\\ W + [\\ d @] \\ W +
除了5555 ...你能分辨出的字母和數字的分布是否還有其他模式? 你可以通過在[\\ d @]之前或之后用至少一個字母的要求替換\\ w來處理它嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.