簡體   English   中英

Python3 正則表達式 findall

[英]Python3 regex findall

這是我的問題。 給出以下列表:

a = ['COP' , '\t\t\t', 'Basis', 'Notl', 'dv01', '6m', '9m', '1y',
     '18m', '2y', '3y', "15.6", 'mm', '4.6', '4y', '5y', '10', 'mm',
     '4.6', '6y', '7y', '8y', '9y', '10y', '20y', 'TOTAL', '\t\t9.2' ]

我正在嘗試獲得一些像這樣的輸出。 最重要的注意事項是以“y”或“m”結尾的第一個數字之后的行,只有當它在列表中時才會出現一個數字示例:('3y', '15.6', '')

SAMPLE OUTPUT(忘記元組的結構,只需要值)

('6m', '', '')
('9m', '', '')
('1y', '', '')
('18m', '', '')
('2y', '', '')
('3y', '15.6', '')
('4y', '', '')
('5y', '10', '')
('6y', '', '')
('7y', '', '')
('8y', '', '')
('9y', '', '')
('10y', '', '')
('20y', '', '')

我使用了以下應該返回的正則表達式:

  1. 所有數字后跟“y”或“m”=> (\\b\\d+[ym]\\b)
  2. 然后是任何數字(整數與否),如果它出現(意味着零次或多次)=> (\\b[0-9]+. [0-9] \\b)

這是我所做的,使用 Python3 regex 和 re.findall(),但仍然沒有結果

rule2 = re.compile(r"(\b\d+[ym]\b)(\b[0-9]+.*[0-9]*\b)+")
a_str = " ".join(a)
OUT2 = re.findall(rule2, a_str)
print(OUT2)
# OUT2 >>[]

為什么我沒有得到正確的結果?

您不能兩次使用字邊界。 由於數據由非字母/數字分隔,因此使用\\W+代替。

然后,轉義點,並將其設為可選,否則您將無法匹配10 不要使用.*因為它會匹配太多(正則表達式貪婪)

這或多或少會產生您正在尋找的東西(請注意,匹配嚴格的數字、整數或浮點數比這更棘手,所以這並不完美):

rule2 = re.compile(r"\b(\d+[ym])\W+([0-9]+\.?[0-9]*)\b")
a_str = " ".join(a)
OUT2 = re.findall(rule2, a_str)
print(OUT2)

[('3y', '15.6'), ('5y', '10')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM