如果某个特定单词存在于字符串中某个单词之前,该如何删除

时间:2018-10-17 05:51:54

标签: python regex

我有一个看起来像这样的字符串

"word1 AND word2 AND word3 AND word4"
"word1 OR word3 AND word4"
"word1 word3"

我想在出现时从字符串中删除word3。为此,我正在使用以下代码

regex = re.compile(re.escape('word3'), re.IGNORECASE)
keywords = regex.sub('', keywords)

如果出现ANDOR单词,我也想删除它们出现在word3之前。无法弄清楚该怎么做。

我需要的输出是

"word1 AND word2 AND word4"
"word1 AND word4"
"word1"

在某些极端情况下,word3是字符串中的第一个单词。在这种情况下,应该删除第一个AND / OR(如果存在)之后

"word3 AND word4 or word1" 

应该成为

"word4 or word1"

5 个答案:

答案 0 :(得分:3)

在转义的输入之前放置一个可以包含var array1 = [apples,oranges,grapes,vegetables,soups] var arraylist = [[apples,oranges,grapes],[vegetables,soups]] ' AND'的可选组:

' OR'

输出:

keywords = "word1 AND word2 AND word3 AND word4"
regex = re.compile('(?:and |or )?' + re.escape('word3') + ' ?', re.IGNORECASE)
keywords = regex.sub('', keywords)
print(keywords)

答案 1 :(得分:3)

\s*(?:AND|OR)?\s*word3

说明:

  • \s*首先会删除开头的空格。
  • (?:AND|OR)?匹配ANDOR(如果存在)
  • \s*允许word3之前的空格

您应该将其替换为""

Demo

答案 2 :(得分:0)

这是最接近可行答案的答案:

keywords = "word3 AND word3 OR word2 AND word1 AND word3 OR word4 AND word3"
keywords = re.sub(r'(?:(?:and|or) )?word3\s*', '', keywords, flags=re.I)
keywords = re.sub(r'^\s*(?:and|or)\s*', '', keywords, flags=re.I)
print(keywords)

word2 AND word1 AND word4

Demo

首先,我们进行类似于其他答案的替换,以删除word3项。在这种情况下,我会寻找一个可能同时删除的AND|OR前置词。但是,有一个极端的情况,例如

word3 AND word2 OR word1

在这里,我们将得到以下结果:

AND word2 OR word1

因此,我对re.sub进行了 second 调用,以删除可能仍存在的前导分隔符。

此答案仍然存在问题。在我的示例输入中:

word3 AND word3 OR word2 AND word1 AND word3 OR word4 AND word3

立即删除所有word3而没有删除分隔符将导致以下情况:

word2 AND word1 AND OR word4

换句话说,我们不清楚应该选择ANDOR来分隔word1和{{1}的 分隔符}。

答案 3 :(得分:0)

您可以尝试使用replace功能。

s = "word1 AND word2 AND word3 AND word4"
s.replace(" AND word3", "").replace(" OR word3","").replace(" word3","")
'word1 AND word2 AND word4'

答案 4 :(得分:0)

我们需要使用具有多个匹配项的正则表达式。请仔细阅读以下文档

https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch05s02.html

keywords = "word1 AND word2 AND word3 AND word4" +"word1 OR word3 AND word4"+"word1 word3"
re.sub(r'\s*word3(?: (?:and|or))?', '', keywords)