Python re.sub查询解析



我正在分析一个隐含"AND"运算符的查询(我的意思是,当2个单词或2个括号或1个单词和一个括号之间有空白时,我应该在那里放一个"AND")。当我得到")("时,很容易匹配和替换,但当我面对"wordexample("或"wordexample1 wordexample2"时,我遇到了问题。考虑到"or"运算符不是隐式的,所以我只需要解析小写字母单词。

一个例子:

a='abc def (ghi) OR jkl'

应该看起来像:amodif='abc AND def AND (ghi) OR jkl'

我已经尝试过使用重库:

print re.sub('[a-z] \(', '[a-z] AND \(',a)

但它将单词的最后一个字母改为[a-z]。有没有保留与re匹配的表达式(在这种情况下是单词的最后一个字母)的一部分?提前感谢

您正在寻找一种捕获机制,该机制允许您使用backreferences恢复匹配和替换的零件。

这是一个有效的正则表达式:

([a-z]) ([(a-z])

替换为1 AND 2,其中1指向用([a-z])捕获的子字符串,2引用用([(a-z])捕获的子文本。

参见regex演示

Python代码:

import re
p = re.compile(r'([a-z]) ([(a-z])')
test_str = "abc def (ghi) OR jkl"
subst = r"1 AND 2"
result = re.sub(p, subst, test_str)
print(result) # => abc AND def AND (ghi) OR jkl

如果您想避免反向引用,另一种尝试可能是使用双re.sub。其中第一个re.subAND替换所有空白,第二个re.subOR替换s+AND OR ANDs+以对其进行校正

因此re.sub(r'(s+)',r' AND ',s)返回'abc AND def AND (ghi) AND OR AND jkl're.sub(r's+AND OR ANDs+',' OR ',re.sub(r'(s+)',r' AND ',s))将其校正为abc AND def AND (ghi) OR jkl

工作示例如下-

>>>s='abc def (ghi) OR jkl'
>>>re.sub(r's+AND OR ANDs+',' OR ',re.sub(r'(s+)',r' AND ',s))
>>>'abc AND def AND (ghi) OR jkl'

最新更新