我有一個看起來像這樣的字串串列:
['MEASUREMENT K02313 New York',\
'MEASUREMENT K02338 London [BC:2.7.7.7]',\
'MEASUREMENT K14761 Kairo [BC:1.2.-.-]',\
'MEASUREMENT K03629 Berlin',\
'MEASUREMENT K02470 Paris [BC:5.6.2.-]',\
'MEASUREMENT K02469 Madrid [BC:5.43.2.2]',\
....]
如您所見,串列中的某些元素具有格式為BC:xxxx的字串,其中 x 可以是 0-999 之間的數字或連字符(“-”)。
現在我想獲得一個單獨的串列,其中保存了所有這些 BC:xxxx 元素。
我嘗試使用正則運算式:
re.findall(r"BC:([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|-).([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|-).([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|-).([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|-)", list_name)
但它不起作用,我收到以下錯誤訊息:
TypeError: expected string or bytes-like object
uj5u.com熱心網友回復:
使用串列推導以及re.search:
inp = ['MEASUREMENT K02313 New York', 'MEASUREMENT K02338 London [BC:2.7.7.7]', 'MEASUREMENT K14761 Kairo [BC:1.2.-.-]', 'MEASUREMENT K03629 Berlin', 'MEASUREMENT K02470 Paris [BC:5.6.2.-]', 'MEASUREMENT K02469 Madrid [BC:5.43.2.2]']
output = [re.search(r'\[BC:.*?\]', x).group() for x in inp if '[BC:' in x]
print(output)
這列印:
['[BC:2.7.7.7]', '[BC:1.2.-.-]', '[BC:5.6.2.-]', '[BC:5.43.2.2]']
uj5u.com熱心網友回復:
您的代碼不起作用,因為您當前正在將字串元組傳遞給該re.findall方法。如果要使用單個命令,請將字串元組轉換為單個字串:
re.findall(r"BC:[\d\.] ", ' '.join(list_name))
uj5u.com熱心網友回復:
似乎您正在將一個陣列傳遞給 findall 函式,嘗試遍歷該陣列的每個元素并將其傳遞給 findall 函式。
uj5u.com熱心網友回復:
您可以在沒有捕獲組的情況下使用您的模式,因為您只需要匹配。
然后串列中的每個專案使用串列理解獲得匹配項(假設有 1 BC: 方括號之間的專案)
{3}可以使用重復點的量詞和沒有前導零的數字 0-999來縮短模式,并且可以通過將連字符添加到第一個字符類來減少一個替代方案[a-z-]
\bBC:(?:[0-9-]|[1-9][0-9]|[1-9][0-9][0-9])(?:\.(?:[0-9-]|[1-9][0-9]|[1-9][0-9][0-9])){3}
正則運算式演示| Python 演示
import re
lst = ['MEASUREMENT K02313 New York',
'MEASUREMENT K02338 London [BC:2.7.7.7]',
'MEASUREMENT K14761 Kairo [BC:1.2.-.-]',
'MEASUREMENT K03629 Berlin',
'MEASUREMENT K02470 Paris [BC:5.6.2.-]',
'MEASUREMENT K02469 Madrid [BC:5.43.2.2]'
]
pattern = r"\bBC:(?:[0-9-]|[1-9][0-9]|[1-9][0-9][0-9])(?:\.(?:[0-9-]|[1-9][0-9]|[1-9][0-9][0-9])){3}"
print ([m.group() for s in lst for m in [re.search(pattern, s)] if m])
輸出
['BC:2.7.7.7', 'BC:1.2.-.-', 'BC:5.6.2.-', 'BC:5.43.2.2']
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496160.html
