我正在分析一个隐含"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.sub
用AND
替换所有空白,第二个re.sub
用OR
替换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'