正则表达式re.findall()搜索以提取以#和邮政编码开头的单位

时间:2018-07-18 09:49:23

标签: python regex python-3.x

我正在使用Python 3.6并尝试使用re.findall()提取字符串中以#开头的一些建筑单元和一些邮政编码(按照此处的说明Extracting phone numbers from a free form text in python by using regex)。我不知道该结构的工作原理,也无法获得所需的结果。 这是我的代码

string='Road #10-13, Tree 26739  #23.04 934047 Holiday'
re.findall(r'[#][0-9(\)][0-9 ,\.\-\(\)]{8,}[0-9 ,\(\)]', string)

基本上我想获得类似的东西

['#10-13,','#23.04 934047 ']

但是我只能得到它,因为#10-13之后有一个逗号:

['#23.04 934047 ']

我要在查询中更改的内容是说字符串以0-9或','之间的数字结尾。因为即使我更改了字符串并在#23.04之后添加了“,”,我仍然会得到相同的结果。 有人还可以向我解释{8,}的含义吗?

3 个答案:

答案 0 :(得分:0)

您的问题不是逗号。您的问题是,{8,}要求匹配的字符数为8个或更多,而#10-13,总共只有7个字符,该部分为5个字符。将其更改为{5,}使其起作用:

>>> re.findall(r'[#][0-9(\)][0-9 ,\.\-\(\)]{5,}[0-9 ,\(\)]', string)
['#10-13, ', '#23.04 934047 ']

不过,我会使用一种更简单的方法,不确定是否满足您的所有要求,但肯定可以在这里使用

>>> re.findall(r'#[-,.\d ()]+', string)
['#10-13, ', '#23.04 934047 ']

答案 1 :(得分:0)

您可以使用预读。即,提取一部分以#开头的字符串,然后提取所有内容,只要有非单词字符(例如空格或),然后紧跟字母即可

re.findall("#.+?(?=\\W+[A-Z])",string)
['#10-13', '#23.04 934047']

答案 2 :(得分:-1)

我觉得正则表达式可能会简单得多

string='Road #10-13, Tree 26739  #23.04 934047 Holiday'
re.findall(r'#[\d\- \.]+', string)

输出:

['#10-13, ', '#23.04 934047 ']