我正在使用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,}的含义吗?
答案 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 ']