繁体   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