python - 正则表达式匹配另一个特定术语之前或之后的术语

标签 python regex

我正在使用此 RegExpression 在某种文本中寻找平方米术语:

([0-9]{1,3}[\.|,]?[0-9]{1,2}?)\s?m\s?[qm|m\u00B2]

效果很好。

现在,只有在它之前或之后存在像“Wohnfläche”/“Wohnfl”/“Wfl”这样的字符串时,才应该匹配这个东西。换句话说:后一个术语是强制性的,但它的位置不是。 为此编写正则表达式通常不是问题,我的问题是如何最优雅地编写它。目前我只看到一种方法:

^[.]*[Wohnfläche|Wohnfl|Wfl]([0-9]{1,3}[\.|,]?[0-9]{1,2}?)\s?m\s?[qm|m\u00B2]

新搜索,与“或”语句组合(我使用的是 Python)

([0-9]{1,3}[\.|,]?[0-9]{1,2}?)\s?m\s?[qm|m\u00B2][.]*[Wohnfläche|Wohnfl|Wfl]$

丑陋的,不是吗? ;)

最佳答案

你可以像这样使用交替:

(?:Wohnfläche|Wohnfl|Wfl)\s*(\d{1,3}(?:[.,]\d{1,2})?)\s?m\s?(qm|m\u00B2)|(\d{1,3}(?:[.,]\d{1,2})?)\s?m\s?(qm|m\u00B2)\s*(?:Wohnfläche|Wohnfl|Wfl)

并检查哪个捕获组匹配。只是不可能在两侧的正则表达式中可选地使用限制性字符串,它们将被忽略。

参见 regex demo

IDEONE demo :

import re
pat = re.compile(r'(?:Wohnfläche|Wohnfl|Wfl)\s*(\d{1,3}(?:[.,]\d{1,2})?)\s?m\s?(qm|m\u00B2)|(\d{1,3}(?:[.,]\d{1,2})?)\s?m\s?(qm|m\u00B2)\s*(?:Wohnfläche|Wohnfl|Wfl)')
strs = ["12,56m qm Wohnfläche", "14.54 mqm Wohnfl", "Wfl 134 m qm"]
for x in strs:
    m = pat.search(x)
    if m:
        if m.group(1): # First alternative found a match
            print("{}".format(m.group(1), " - ", m.group(2)))
        else:          # Second alternative "won"
            print("{}".format(m.group(3), " - ", m.group(4)))

关于python - 正则表达式匹配另一个特定术语之前或之后的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36765917/

相关文章:

python - 如何使用字符串操作在 python 中创建一个 n x n 的 X 框? (例如,替换、计数、查找、len 等)

python - 将 SymPy 表达式转换为 NumPy longdouble 的精度问题

python - 如何在seaborn clustermap中将Y刻度标签标记为组/类别?

regex - 如何测试Emacs Lisp代码的`font-lock-keywords'值

regex - UI-Router 的简单正则表达式路由约束

arrays - 如何提取全名数组中的姓氏?

java - 需要正则表达式帮助

python - "version"和 "release"的标准 Python 含义是什么?

regex - 使用正则表达式拆分字符串

python - 当目标字符串包含在列表中时,str.replace 似乎无法正常运行