Python 仅当模式不在转义字符串内时,才返回match对象

Python 仅当模式不在转义字符串内时,才返回match对象,python,python-3.x,Python,Python 3.x,仅当模式不在转义字符串内时,如何获取匹配对象? 例如,给定字符串: 'my string \"string string inside of escaped string\" string string' 如何忽略转义字符串中的任何子字符串: \"string inside of escaped string\" 并且只从转义字符串中不包含的子字符串中获取匹配项 例如: 返回 ['mystring', 'mystring', 'mystring', 'mystring'] 得到4场比赛而不

仅当模式不在转义字符串内时,如何获取匹配对象? 例如,给定字符串:

'my string \"string string inside of escaped string\" string string'
如何忽略转义字符串中的任何子字符串:

\"string inside of escaped string\"
并且只从转义字符串中不包含的子字符串中获取匹配项

例如:

返回

['mystring', 'mystring', 'mystring', 'mystring']

得到4场比赛而不是6场?(即忽略转义字符串内部的匹配项。)

首先通过删除内部带引号的字符串,然后搜索剩余内容:

>>> strippedstring = re.sub(r'"[^"]*"', '', myString)
>>> re.findall(r"\bstring", strippedstring)
['string', 'string', 'string', 'string']
如果需要,添加第二轮删除单引号。如果需要实际的周围引号(它们可能会影响单词边界或类似内容),请使用替换字符串
“”“”
,以便保留引号,但删除内容

另一种允许您在重建原始字符串的同时变异匹配项的方法是在带引号的文本上拆分(使用捕获,以避免丢失),变异结果中的偶数索引(未带引号的文本),然后将其重新连接在一起:

import itertools

# Puts the quoted strings in the odd indices and the unquoted in the even
splitstr = re.split(r'("[^"]*")', myString)

# Process only the even indices
for i, x in itertools.islice(enumerate(splitstr), None, None, 2):
    splitstr[i] = re.sub(r'\bstring', 'foo', x)

# Put it all back together and print
newstring = ''.join(splitstr)
print(newstring)
哪些产出:

我的foo-foo“字符串在转义字符串foo-foo中


\“
仍然是
。它们只是引用。如果你想用正则表达式删除引号中的所有内容,你可以尝试:
re.sub(“.+?”,“”)
。我知道,但我更喜欢在可能的情况下使用双引号,这样就成了逃避它们的习惯,我只是在这里使用单引号,以便更容易理解问题。但它们仍然是引号,例如:
“string\”string“.替换(“,”和“)
。谢谢你的回答,但我需要忽略引号内的文本,我无法删除它们。@芒果:为什么不?原始字符串在这里保持不变,因此你没有丢失任何数据,我们只是制作一个临时剥离字符串来删除我们不关心的内容。因为如果我删除引号内的文本,我必须修改找到的匹配项ide加引号后,输出将不正确。是否可以获取我需要的匹配位置,并使用RegEx修改该位置?@Mango:我举了一个例子,说明如何在修改未加引号的数据时保留带引号字符串的内容。这有点复杂,但仍然比尝试制作一个不带引号的RegEx要简单他立刻开始工作。
import itertools

# Puts the quoted strings in the odd indices and the unquoted in the even
splitstr = re.split(r'("[^"]*")', myString)

# Process only the even indices
for i, x in itertools.islice(enumerate(splitstr), None, None, 2):
    splitstr[i] = re.sub(r'\bstring', 'foo', x)

# Put it all back together and print
newstring = ''.join(splitstr)
print(newstring)