首页 > 解决方案 > 如何使用正则表达式将数字与给定单词分开?

问题描述

如果它们被数字包围,我需要分隔给定的单词。例如,单词是“x”。

s = '''
1x 3    # OK
s1x2    # WRONG
2x      # OK
s1 x2   # WRONG
x2      # OK
1sx3    # WRONG
'''

print(re.sub("(?<=\d)\s*x\s*(?=\d)", " x ", s))

即使周围的数字不是数字,这也会将所有内容分开,我的意思是,s1 x2也不s1x3x应该匹配。

另一方面,它不适用于“否” - 仅适用于最后 2 行:

s = '''
2 no 3  # OK (but it's not needed to match)
2no     # OK
3no2    # OK
no9     # OK
xno9    # WRONG
5 non   # WRONG (for 'no')
'''

print(re.sub("(?<=\d)\s*no\s*(?=\d)", " x ", s))

我已经编辑了一些例子。需要在句子中使用它,例如:

切断土地并竖立 1x 3 卧室小屋平房和 1x2 卧室平房。安装 2 个非照明招牌和 2 个无广告标志。

第 1 句中的两者都应该匹配,只有第 2 句中的第 2 句匹配。

编辑

感谢下面的帖子,我发现这个匹配:

\b(?:\d*\s*x\s*\d+|\d+\s*x\s*\d*)\b

但问题是它不适用于更换。这个想法是为被数字包围的单词添加一个额外的空间。因此,虽然这个 now 模式正确地选择了那些短语(来自单行和句子),但它不适用于替换,因为它应该只匹配这些单词:

s = "Sever land and erect 1x 3 Bedroom chalet bungalow and 1x2 Bedroom bungalow"

re.sub("\b(?:\d*\s*x\s*\d+|\d+\s*x\s*\d*)\b", " x ", s, flags=re.IGNORECASE)

标签: pythonregex

解决方案


您可以使用交替使用|来匹配任一侧所需的数字,其中xno 可以在中间匹配。

^(?:\d* *(?:x|no)\s*\d+|\d+\s*(?:x|no) *\d*)$

正则表达式演示


推荐阅读