如何在正则表达式中整体使用数字

时间:2018-08-15 06:40:45

标签: regex python-3.x

我有一些中文地址,我想用正则表达式提取字符串。我想像这样

"商城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室'>

可能有点难以理解,但我也希望有人能帮助解决这个问题。

谢谢。

2 个答案:

答案 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室'>