Python正则表达式仅在独立时匹配

时间:2018-06-02 09:31:51

标签: python regex

在python3中使用re,我希望匹配文本中百分比的外观,并用特殊标记替换它们(例如用“A @ percent @ increase”代替“A 30%增加”)。

如果百分比表达式是独立项,我只想匹配。例如,它不匹配“产品的​​代码是A322%n43%”。但是,当一行只包含一个百分比表达式(如“89%”)时,它应匹配。

我尝试在我的正则表达式中使用分隔符,例如\ b,但因为%本身是非字母数字字符,所以它不会捕获表达式的结尾。使用\ s使得无法将符号表达在一条线上。

目前,我有代码:

>>> re.sub(r"[+-]?[.,;]?(\d+[.,;']?)+%", ' @percent@ ', "1,211.21%")
' @percent '
如果表达式后跟字母或其他文本(如上面的产品代码示例),

仍然匹配。

>>> re.sub(r"[+-]?[.,;]?(\d+[.,;']?)+%", ' @percent@ ', "EEE1,211.21%asd")
'EEE @percent@ asd'

你会推荐什么?

2 个答案:

答案 0 :(得分:0)

尝试将“第一个”捕获组添加为“秒”。

original: r"[+-]?[.,;]?(\d+[.,;']?)+%"
suggestd: r"[+-]?[.,;]?((\d+[.,;']?)+%)\b"

答案 1 :(得分:0)

看起来像Negative Lookbehind和Negative Lookahead的完美工作:

re.sub(r'''(?<![^\s]) [+-]?[.,;]? (\d+[.,;']?)+% (?![^\s.,;!?'"])''', 
       '@percent@', string, flags=re.VERBOSE)

(?<![^\s])表示“在允许当前位置之前没有空格”(如果需要,添加更多禁用字符)。

(?![^\s.,;!?'"])表示“在允许当前位置后立即没有空格,句号等。”

演示:https://regex101.com/r/khV7MZ/1