在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'
你会推荐什么?
答案 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.,;!?'"])
表示“在允许当前位置后立即没有空格,句号等。”