Python正则表达式匹配所有出现的十进制模式,后跟另一个模式

时间:2016-06-24 08:26:13

标签: python regex

我做了很多搜索,包括this SO post,这几乎对我有用。

我正在处理一个巨大的字符串,试图捕获在一系列小数模式之后出现的四位数组和一个字母数字字。

还有其他四位数字组不合格,因为它们之前有单词或其他数字模式。

编辑:我的字符串不是多行的,为了方便起见,它只是在这里显示。

例如:

>> my_string = """BEAVER COUNTY 001 0000 
1010 BEAVER 
2010 BEAVER COUNTY SCH DIST 
0.008504 
...(more decimals)
0.008508 
4010 COUNTY SPECIAL SERVICE DIST NO.1   <---capture this 4010
4040 BEAVER COUNTY 
8005 GREENVILLE SOLAR
0.004258 
0.008348 
...(more decimals)
0.008238 
4060 SPECIAL SERVICE DISTRICT NO 7   <---capture this 4060
"""

理想的re.findall应该返回:

['4010','4060']

以下是我尝试过的缺乏的模式:

re.findall(r'(?=(\d\.\d{6}\s+)(\s+\d{4}\s))', my_string)
# also tried         
re.findall("(\s+\d{4}\s+)(?:(?!^\d+\.\d+)[\s\S])*", my_string)
# which gets me a little closer but I'm still not getting what I need.

提前致谢!

3 个答案:

答案 0 :(得分:0)

单线串法:

只需匹配 4个独立数字之前的浮点数

r'\d+\.\d+\s+(\d{4})\b'

请参阅this regex demo

Python demo

import re
p = re.compile(r'\d+\.\d+\s+(\d{4})\b')
s = "BEAVER COUNTY 001 0000 1010 BEAVER 2010 BEAVER COUNTY SCH DIST 0.008504 0.008508 4010 COUNTY SPECIAL SERVICE DIST NO.1 4040 BEAVER COUNTY 8005 GREENVILLE SOLAR 0.004258 0.008348 0.008238 4060 SPECIAL SERVICE DISTRICT NO 7"
print(p.findall(s))
# => ['4010', '4060']

原始答案:MULTILINE STRING

您可以使用正则表达式检查上一行的浮点值,然后在下一行捕获独立的4位数字:

re.compile(r'^\d+\.\d+ *[\r\n]+(\d{4})\b', re.M)

请参阅regex demo here

模式说明

  • ^ - 开始一行(使用re.M
  • \d+\.\d+ - 1位数字,.以及1位或更多位数
  • * - 零个或多个空格(替换为[^\S\r\n]仅匹配水平空格)
  • [\r\n]+ - 一个或多个LF或CR符号(仅限于1个换行符,替换为(?:\r?\n|\r)
  • (\d{4})\b - 由re.findall匹配的4位数字返回的组1后跟一个字边界(非数字,非字母,非_)。

Python demo

import re
p = re.compile(r'^\d+\.\d+ *[\r\n]+(\d{4})\b', re.MULTILINE)
s = "BEAVER COUNTY 001 0000 \n1010 BEAVER \n2010 BEAVER COUNTY SCH DIST \n0.008504 \n...(more decimals)\n0.008508 \n4010 COUNTY SPECIAL SERVICE DIST NO.1   <---capture this 4010\n4040 BEAVER COUNTY \n8005 GREENVILLE SOLAR\n0.004258 \n0.008348 \n...(more decimals)\n0.008238 \n4060 SPECIAL SERVICE DISTRICT NO 7   <---capture this 4060"
print(p.findall(s)) # => ['4010', '4060']

答案 1 :(得分:0)

这将对您有所帮助:

"((\d+\.\d+)\s+)+(\d+)\s?(?=\w+)"gm

使用第三组意味着\ 3

Demo And Explaination

答案 2 :(得分:0)

试试这个模式:

re.compile(r'(\d+[.]\d+)+\s+(?P<cap>\d{4})\s+\w+')

我写了一些代码并检查了它并且它有效。

import re

p=re.compile(r'(\d+[.]\d+)+\s+(?P<cap>\d{4})\s+\w+')

my_string = """BEAVER COUNTY 001 0000 
1010 BEAVER 
2010 BEAVER COUNTY SCH DIST 
0.008504 
...(more decimals)
0.008508 
4010 COUNTY SPECIAL SERVICE DIST NO.1   <---capture this 4010
4040 BEAVER COUNTY 
8005 GREENVILLE SOLAR
0.004258 
0.008348 
...(more decimals)
0.008238 
4060 SPECIAL SERVICE DISTRICT NO 7   <---capture this 4060
"""

s=my_string.replace("\n", " ")

match=p.finditer(s)

for m in match:
    print m.group('cap')