Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果字符串中某个单词之前存在特定单词,如何删除该单词_Python_Regex - Fatal编程技术网

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

Python 如果字符串中某个单词之前存在特定单词,如何删除该单词,python,regex,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) 我还想删除出现在和或或单词之前的和单词。不知道怎么做 我需要的输出是 "w

我有一根看起来像

"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)
我还想删除出现在
单词之前的
单词。不知道怎么做

我需要的输出是

"word1 AND word2 AND word4"
"word1 AND word4"
"word1"
在某些情况下,
word3
是字符串中的第一个单词。在这种情况下,应删除第一个和/或第二个(如果存在)

"word3 AND word4 or word1" 
应该成为

"word4 or word1"

在转义输入之前放置一个可选组,该组可以包含
”和“
”或“
”:

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

word1 AND word2 AND word4

在转义输入之前放置一个可选组,该组可以包含
”和“
”或“
”:

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

word1 AND word2 AND word4
说明:

  • 开头的
    \s*
    删除前导空格
  • (?:和|或)?
    匹配
    如果存在
  • \s*
    允许在
    word3
您应该将其替换为

说明:

  • 开头的
    \s*
    删除前导空格
  • (?:和|或)?
    匹配
    如果存在
  • \s*
    允许在
    word3
您应该将其替换为


这是我能得到的最接近于工作答案的答案:

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

首先,我们做一个类似于其他答案的替换,删除
word3
术语。在本例中,我寻找一个可能的前面的
和|或
术语也要删除。但是,存在一种边缘情况,例如

word3 AND word2 OR word1
在这里,我们将以以下方式结束:

AND word2 OR word1
因此,我再次调用
re.sub
,以删除可能仍然存在的前导分隔符

这个答案仍然有一个问题。在我的示例输入中:

word3 AND word3 OR word2 AND word1 AND word3 OR word4 AND word3
删除所有
word3
术语而不立即删除分隔符会留下以下内容:

word2 AND word1 AND OR word4

换句话说,我们不清楚应该在这里选择哪个分隔符,
,来分隔
word1
word4
术语。

这是我能找到的最接近于工作答案的东西:

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

首先,我们做一个类似于其他答案的替换,删除
word3
术语。在本例中,我寻找一个可能的前面的
和|或
术语也要删除。但是,存在一种边缘情况,例如

word3 AND word2 OR word1
在这里,我们将以以下方式结束:

AND word2 OR word1
因此,我再次调用
re.sub
,以删除可能仍然存在的前导分隔符

这个答案仍然有一个问题。在我的示例输入中:

word3 AND word3 OR word2 AND word1 AND word3 OR word4 AND word3
删除所有
word3
术语而不立即删除分隔符会留下以下内容:

word2 AND word1 AND OR word4

换句话说,我们不清楚应该在这里选择哪个分隔符,
来分隔
word1
word4
术语。

您可以尝试使用
替换
功能

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

您可以尝试使用
replace
功能

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

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


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


我不确定这是否适用于输入
word1 word2 word3
,因为您已将
和|或
分隔符设置为必填项。和/或在该编辑中不是必填项,但它仍然不适用于
word1 word2 word3
,因为您已将尾随空格设置为必填项…哦,谢谢各位,修复了。我正在试图找出一种方法,仅对转义输入使用
(?i)
(?-i)
,但它似乎不适用于Python我不确定这是否适用于输入
word1 word2 word3
,因为您已将
和|或
分隔符设置为必填项。并且/或者,在该编辑中不是必填项,但是它在
word1 word2 word3
上仍然不起作用,因为您将尾随空格设置为必需的…哎呀,谢谢大家,修复了。我们试图找到一种方法,仅对转义输入使用
(?i)
(?-i)
,但它似乎不适用于python注意,除非您使用任何优先级规则处理这些字符串,而不是从左到右,否则这样做会把事情搞砸。通常
的优先级高于
;因此
word1和word2或word3和word4执行为
(word1和word2)或(word3和word4)
;如果删除
或word3
,则会得到
word1、word2和word4
,这是一个非常不同的表达式。我看不到任何方法可以用regex真正做到这一点。这个问题是
word3
术语可以是第一个、中间个或最后一个,在这些情况下,我们可能必须在出现之前或之后删除
和|或
分隔符。一般来说,这里可能需要一个解析器。请注意,除非您使用从左到右的简单规则之外的任何优先规则来处理这些字符串,否则这样做会把事情搞砸。通常
的优先级高于
;因此
word1和word2或word3和word4执行为
(word1和word2)或(word3和word4)
;如果删除
或word3
,则会得到
word1、word2和word4
,这是一个非常不同的表达式。我看不到任何方法可以用regex真正做到这一点。这个问题是
word3
术语可以是第一个、中间个或最后一个,在这些情况下,我们可能必须在出现之前或之后删除
和|或
分隔符。一般来说,这里可能需要一个解析器。如果“word3”是第一个呢?您不想删除它右边的空白吗?您应该在这里给出Python代码