使用 Python re 和 findall 匹配字符串中数字的复杂组合
Using Python re and findall to match complex combination of digits in string
我正在尝试使用 python re 库来分析包含街道名称和多个(或仅一个)由正斜杠分隔的数字的字符串。
example = 'Examplestreet 1/2.1/3a/10/10.1/11b/12a-12c/13a-c'
我想匹配所有数字,包括点之后的位置和相邻的字母字符。如果连字符用字母字符连接两个数字,它们也应被视为一个匹配项。
预期输出:
['1', '2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
我正在尝试以下方法
numbers = re.findall(r'\d+\.*\d*\w[-\w]*', example)
能够找到除单个非浮点数以外的所有数字(即 '1'
):
print(numbers)
['2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
我需要如何调整我的正则表达式才能获得所需的输出?
这个有效:
numbers = re.findall(r'\d[0-9a-z\-\.]*', example)
模式与单个 1 不匹配,因为 \d+\.*\d*\w[-\w]*
需要至少 2 个字符,对于 \d+
至少是 1 个数字,对于 \w
至少是 1 个单词字符
如果地址不应该以-
结尾,并且只能匹配数字后的字符a-z,并且使用不区分大小写的匹配:
\b\d+(?:\.\d+)?[a-z]*(?:-\w+)*
\b
一个单词边界
\d+(?:\.\d+)?
匹配带有可选小数部分的数字
[a-z]*
匹配可选字符 a-z
(?:-\w+)*
可选重复匹配-
和1个或多个单词字符
请注意,匹配地址可能很困难,因为可能有许多不同的符号,此模式匹配示例字符串中的给定格式。
import re
example = 'Examplestreet 1/2.1/3a/10/10.1/11b/12a-12c/13a-c'
pattern = r"\b\d+(?:\.\d+)?[a-z]*(?:-\w+)*"
print(re.findall(pattern, example))
输出
['1', '2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
使用正则表达式
工作示例:https://regex101.com/r/PDYSgH/1
import re
example = 'Examplestreet 1/2.1/3a/10/10.1/11b/12a-12c/13a-c'
numbers = re.findall(r'\d[a-z0-9.\-]*', example)
使用拆分
可能您可以使用 space
拆分字符串,然后使用 /
。
numbers = example.split(" ")[-1].split("/")
另一个解决方案,似乎更简单:
>> re.findall(r'\d[^/]*', example)
['1', '2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
您可以确认它有效 here(尽管我不得不转义斜杠 (/
) 字符)。
\d[^/]*
:匹配以数字开头且后跟任何字符的任何字符串,/
除外(在所述字符处停止)。
我正在尝试使用 python re 库来分析包含街道名称和多个(或仅一个)由正斜杠分隔的数字的字符串。
example = 'Examplestreet 1/2.1/3a/10/10.1/11b/12a-12c/13a-c'
我想匹配所有数字,包括点之后的位置和相邻的字母字符。如果连字符用字母字符连接两个数字,它们也应被视为一个匹配项。
预期输出:
['1', '2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
我正在尝试以下方法
numbers = re.findall(r'\d+\.*\d*\w[-\w]*', example)
能够找到除单个非浮点数以外的所有数字(即 '1'
):
print(numbers)
['2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
我需要如何调整我的正则表达式才能获得所需的输出?
这个有效:
numbers = re.findall(r'\d[0-9a-z\-\.]*', example)
模式与单个 1 不匹配,因为 \d+\.*\d*\w[-\w]*
需要至少 2 个字符,对于 \d+
至少是 1 个数字,对于 \w
如果地址不应该以-
结尾,并且只能匹配数字后的字符a-z,并且使用不区分大小写的匹配:
\b\d+(?:\.\d+)?[a-z]*(?:-\w+)*
\b
一个单词边界\d+(?:\.\d+)?
匹配带有可选小数部分的数字[a-z]*
匹配可选字符 a-z(?:-\w+)*
可选重复匹配-
和1个或多个单词字符
请注意,匹配地址可能很困难,因为可能有许多不同的符号,此模式匹配示例字符串中的给定格式。
import re
example = 'Examplestreet 1/2.1/3a/10/10.1/11b/12a-12c/13a-c'
pattern = r"\b\d+(?:\.\d+)?[a-z]*(?:-\w+)*"
print(re.findall(pattern, example))
输出
['1', '2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
使用正则表达式
工作示例:https://regex101.com/r/PDYSgH/1
import re
example = 'Examplestreet 1/2.1/3a/10/10.1/11b/12a-12c/13a-c'
numbers = re.findall(r'\d[a-z0-9.\-]*', example)
使用拆分
可能您可以使用 space
拆分字符串,然后使用 /
。
numbers = example.split(" ")[-1].split("/")
另一个解决方案,似乎更简单:
>> re.findall(r'\d[^/]*', example)
['1', '2.1', '3a', '10', '10.1', '11b', '12a-12c', '13a-c']
您可以确认它有效 here(尽管我不得不转义斜杠 (/
) 字符)。
\d[^/]*
:匹配以数字开头且后跟任何字符的任何字符串,/
除外(在所述字符处停止)。