3 回答

TA貢獻1831條經驗 獲得超9個贊
假設這些符號僅在單詞字符之前使用,您可以使用此正則表達式:
(?:]\B[@#$:]\w+[^@#$:]*){5}
代碼:
>>> arr = ['@someword someotherword anotherword word1 word2 word3',
'@someword :someotherword #anotherword $word1 word2 word3',
'@someword :someotherword #anotherword $word1 #word2 $word3']
>>> reg = re.compile(r'(?:\B[@#$:]\w+[^@#$:\n]*){5}');
>>> for i in arr:
... print(reg.findall(i))
...
[]
[]
['@someword :someotherword #anotherword $word1 #word2 ']
\B
:\b
不匹配的地方。[@#$:]\w+
: 匹配 1+ 個以開頭的單詞字符[@#$:]
[^@#$:]*
: 匹配 0 個或多個不包含的字符[@#$:]
(...){5}
: 在當前輸入中匹配 5 個

TA貢獻1825條經驗 獲得超4個贊
積極的前瞻將是做到這一點的一種方法:
input = "@someword :someotherword #anotherword $word1 #word2 $word3"
result = re.match(r'.*((?<=\s)|(?<=^))[@#$:]\S+.*(\s[@#$:]\S+.*){4}', input)
if result:
print("Found a match")
這個問題很棘手,因為你想用 start a special symbol 匹配單詞[@#$:]。但是,我們不能只使用單詞邊界\b,因為特殊字符不是單詞字符。因此,相反,我們可以檢查目標術語開頭之前的內容是空格還是字符串的開頭。

TA貢獻1812條經驗 獲得超5個贊
正確的正則表達式是((?:[@#$].+){5}). 正則表達式解釋
例子:
import re
...
tst = """
@someword someotherword anotherword word1 word2 word3
@someword :someotherword #anotherword $word4 #word5 $word6
@someword :someotherword #anotherword $word1 word2 word3
@someword :someotherword #anotherword $word1 #word2 $word3
"""
res = re.findall(r"((?:[@#$].+){5})", tst)
print(res)
結果:
['@someword :someotherword #anotherword $word4 #word5 $word6', '@someword :someotherword #anotherword $word1 #word2 $word3']
分享
添加回答
舉報