我有一些中文地址,我想用正则表达式提取字符串。我想像这样
"商城1栋11楼1112室 " #return <_sre.SRE_Match object; span=(7, 12), match='1112室'>
我的想法是删除满足“栋+数字+(楼|单元)”的格式。我用(栋+[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室'>
可能有点难以理解,但我也希望有人能帮助解决这个问题。
谢谢。
答案 0 :(得分:2)
在(栋+[0-9]*(?!楼|单元))|([0-9]+室)
中,第一个替代项将匹配栋
,后跟一个数字,后跟楼
或单元
。但这还不够;您还希望[0-9]*
匹配尽可能多的数字,这意味着也不能跟数字。否则,正如您所观察到的,它将与栋1
中的栋11
相匹配:栋1
后跟1
,这不是禁止的跟随序列。
因此,您需要将数字添加到无法跟随的事物列表中:
(栋+[0-9]*(?![0-9]|楼|单元))|([0-9]+室)
[0-9]*
应该是[0-9]+
,因为[0-9]*
会很高兴地匹配一个空字符串。
答案 1 :(得分:1)
您可以使用条件语句:
(\D\d{4}$)?(?(1)|(\d{4}\D))
(\D\d{4}$)
第一个捕获组。非数字D
,然后在字符串\d{4}
的末尾跟随四位数字$
。 ?
将前面的模式设为可选。(?(1)
有条件的语句,如果存在捕获组1,则不再匹配。|(\d{4}\D))
或|
,匹配并捕获四位数字\d{4}
,后跟一个非数字\D
。您可以尝试模式here。
或者,您可以使用以下模式稍微加快正则表达式的速度:
([栋元]\d{4}$)?(?(1)|(\d{4}[元室]))
仅检查字符栋
或元
,而不检查任何非数字\D
。
您可以尝试模式here。
在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室'>