【问题标题】:Python re.sub query parsingPython re.sub 查询解析
【发布时间】:2016-01-05 09:39:40
【问题描述】:

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

一个例子:

a='abc def (ghi) OR jkl'

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

我已经尝试过使用 re 库:

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

但是它用 [a-z] 改变了单词的最后一个字母。无论如何要保留匹配表达式的一部分(在这种情况下是单词的最后一个字母)与re?提前致谢

【问题讨论】:

标签: python regex


【解决方案1】:

您正在寻找一种捕获机制,该机制可让您使用反向引用恢复匹配和替换的部分。

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

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

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

regex demo

Python code:

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

【讨论】:

  • 我知道如果要求更精确,解决方案可能会有点不同,但是基本思想应该是一样的。或者,可以在更复杂的场景中使用环视。
  • 它对我来说很好用。我不知道反向引用。感谢您的解决方案
【解决方案2】:

如果您想避免反向引用,另一种尝试可能是使用 double re.sub。其中第一个re.sub 将所有空格替换为AND,第二个re.sub\s+AND OR AND\s+ 替换为OR 以更正它。

所以re.sub(r'(\s+)',r' AND ',s) 返回'abc AND def AND (ghi) AND OR AND jkl' 并且re.sub(r'\s+AND OR AND\s+',' 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 AND\s+',' OR ',re.sub(r'(\s+)',r' AND ',s))
>>>'abc AND def AND (ghi) OR jkl'

【讨论】:

  • 该解决方案的问题是查询中有可能是“word1 word2”的术语,并且该实现会在我猜的术语中放置一个 AND。无论如何感谢您的努力
  • 啊!如果 word1 word2 类似于 abc AND def AND (ghi) OR jkl abc AND def AND (ghi) OR jkl 那么 ([a-z]) ([(a-z]) 也会将 AND 放在其中??
猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2014-05-24
  • 1970-01-01
  • 2020-03-08
  • 2021-05-11
  • 2010-09-22
相关资源
最近更新 更多