我一直面臨這個我無法解決的問題。
compiler = re.compile(r'\d*[05]')
result = compiler.findall('0 20 201 95 5 52 35 999 40 19 50 1000 245 1050 118 2500')
期望的輸出:
['20', '95', '5', '35', '40', '50', '1000', '245']
根據我上面的代碼,我可以實作的最接近:
['0', '20', '20', '95', '5', '5', '35', '40', '50', '1000', '245', '1050', '2500']
我應該只在代碼的虛線部分提供我的答案re.compile(r'--------')。
如果有人可以幫助我,那就太好了,謝謝。
uj5u.com熱心網友回復:
可以通過使用正則運算式模式,來滿足要求\b(?!0)(?:\d{0,2}[05]\b|1000)\b。
演示:
import re
compiler = re.compile(r'\b(?!0)(?:\d{0,2}[05]\b|1000)\b')
result = compiler.findall('0 20 201 95 5 52 35 999 40 19 50 1000 245 1050 118 2500')
print(result)
輸出:
['20', '95', '5', '35', '40', '50', '1000', '245']
正則運算式的解釋:
\b: 字邊界(?!0): 負前瞻斷言不應該0有當前位置的超前。(?:: 非捕獲組的開始\d{0,2}: 一個數字,零到兩次[05]: 0 或 5\b: 字邊界|1000: 或 1000
): 非捕獲組結束\b: 字邊界
根據第四只鳥 的以下寶貴建議進行更新:
為了防止 1000 的部分匹配,您可以從單詞邊界開始,斷言非零并將整個交替包裝在非捕獲組中,再次以單詞邊界結束
\b(?!0)(?:\d{0,2}[05]\b|1000)\b
uj5u.com熱心網友回復:
正如@depperm 指出的那樣
\b(?!\b0\b)(\d{0,2}[05]|1000)\b
將是滿足您需求的完美正則運算式。
我的想法只適用于一個數字
^\d{0,2}[05]$|^1000$
解釋:
^顯示,字串必須從這里開始/d{0,2}代表 0,1 或 2 個數字[05]數字 0 或 5,因為 5 的所有倍數都以 0 或 5 結尾$字串的結尾|代表操作員或^1000$代表字串 1000
但正如已經指出的,你也可以用其他方式看待
uj5u.com熱心網友回復:
您不需要為此使用正則運算式。你可以使用一個理解:
result = [i for i in data.split() if not (n := int(i)) % 5 and n <= 1000 and n]
這相當于:
result = []
for i in data.split():
n = int(i)
if not n % 5 and n <= 1000 and n:
result.append(i)
uj5u.com熱心網友回復:
當所有內容都在一個字串中時,我們需要為搜索添加邊界。另一個答案是接近,但我們不能匹配^,并$當單字串包含多個值。
\b 或單詞邊界確保在匹配字串之前或之后沒有額外的數字。
圖案: \b0\b|(\b\d{0,2}[05]\b|\b1000\b)
所有想要的比賽都在第 1 組
https://regex101.com/r/Efhcsb/2
uj5u.com熱心網友回復:
您可以使用 5 到 1000 之間的標準數字范圍生成器來獲得
[5-9]|[1-9]\d|[1-9]\d{2}|1000
然后用 '[05]' 替換最后一位數字得到5|[1-9][05]|[1-9]\d[05]|1000.
重構它并添加單詞邊界的 '\b' 以獲得 \b(?:5|[1-9]\d?[05]|1000)\b
蟒蛇測驗:
>>> import re
>>> Rx = re.compile(r'\b(?:5|[1-9]\d?[05]|1000)\b')
>>> Rx.findall('0 20 201 95 5 52 35 999 40 19 50 1000 245 1050 118 2500')
['20', '95', '5', '35', '40', '50', '1000', '245']
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317350.html
