我有一些中文地址,我想用正则表达式提取字符串。
"商城1栋11楼1112室 " #return <_sre.SRE_Match object; span=(7, 12), match='1112室'>我的想法是删除满足"栋+ number + (楼|单元)“的格式。我用(栋+[0-9]*(?!楼|单元))做的,但它把数字分开了。详情如下:
>>>ms = re.finditer(re.compile("(栋+[0-9]*(?!楼|单元))|([0-9]+室)"),"商城1栋11楼1112室")结果是:
<_sre.SRE_Match object; span=(3, 5), match='栋1'>
<_sre.SRE_Match object; span=(7, 12), match='1112室'>我如何实现使用数字作为一个整体的目标?
更多的例子:
"商城1栋1112" #return <_sre.SRE_Match object; span=(3, 8), match='栋1112'>
"商城1栋23单元1112室" #return <_sre.SRE_Match object; span=(8, 13), match='1112室'>这可能有点难理解,但我也希望有人能帮助解决这个问题。
提前谢谢。
发布于 2018-08-15 07:02:50
在(栋+[0-9]*(?!楼|单元))|([0-9]+室)中,第一个选项将与栋匹配,后面跟着一个数字,后面不是楼,也不是单元。但这还不够;您还希望[0-9]*能够匹配尽可能多的数字,这意味着它的后面也不能跟着一个数字。否则,正如您所观察到的,它将与栋1在栋11中匹配:栋1后面跟着一个1,这不是禁止的跟踪序列之一。
因此,您需要将数字添加到无法跟随的事物列表中:
(栋+[0-9]*(?![0-9]|楼|单元))|([0-9]+室)[0-9]*可能应该是[0-9]+,因为[0-9]*将愉快地匹配空字符串。
发布于 2018-08-15 07:13:18
您可以使用条件语句:
(\D\d{4}$)?(?(1)|(\d{4}\D))(\D\d{4}$)第一捕捉组。一个非数字的D,在字符串$的末尾跟着四位数的\d{4}。?使前面的模式可选。(?(1)条件语句,如果存在捕获组1,则不再匹配。|(\d{4}\D))或|,匹配并捕获四位数字\d{4},然后是非数字\D。您可以尝试模式这里。
或者,您可以使用模式稍微加快正则表达式:
([栋元]\d{4}$)?(?(1)|(\d{4}[元室]))它只检查字符栋或元,而不是任何非数字\D。
您可以尝试模式这里。
在Python中:
import re
pattern = re.compile('(\D\d{4}$)?(?(1)|(\d{4}\D))')
print(re.search(pattern,'商城1栋11楼1112室'))
print(re.search(pattern,'商城1栋1112'))
print(re.search(pattern,'商城1栋23单元1112室'))指纹:
re.Match object; span=(7, 12), match='1112室'>
<re.Match object; span=(3, 8), match='栋1112'>
<re.Match object; span=(8, 13), match='1112室'>https://stackoverflow.com/questions/51854049
复制相似问题