Python 否定匹配的正则表达式模式
我们希望将换行符(Python 否定匹配的正则表达式模式,python,regex,quotes,regex-negation,Python,Regex,Quotes,Regex Negation,我们希望将换行符(\r\n、\n或\r)之间出现的字符分组在一起,但忽略引号内出现的换行符。大概是这样的: test = 'hello \r\n you, hi, hola, "hei\nhei", hej\r\nhello, hi, hola, "hei\nhei", "hej\r\ngreat", you?' match -> hello match -> you, hi, hola, "hei\nhei", hej match -> hello, hi, hola,
\r\n
、\n
或\r
)之间出现的字符分组在一起,但忽略引号内出现的换行符。大概是这样的:
test = 'hello \r\n you, hi, hola, "hei\nhei", hej\r\nhello, hi, hola, "hei\nhei", "hej\r\ngreat", you?'
match -> hello
match -> you, hi, hola, "hei\nhei", hej
match -> hello, hi, hola, "hei\nhei", "hej\r\ngreat", you?
我们设法使某些东西能够满足大多数需求,但它不会忽略引号中的换行符:
In [342]: test = 'hello \r\n you, hi, hola, "hei\nhei", hej\r\nhello, hi, hola, "hei\nhei", "hej\r\ngreat", you?'
In [343]: [r for r in re.finditer(r'([^(\r\n)])+', test)]
Out[343]:
[<_sre.SRE_Match object; span=(0, 6), match='hello '>,
<_sre.SRE_Match object; span=(8, 28), match=' you, hi, hola, "hei'>,
<_sre.SRE_Match object; span=(29, 38), match='hei", hej'>,
<_sre.SRE_Match object; span=(40, 61), match='hello, hi, hola, "hei'>,
<_sre.SRE_Match object; span=(62, 72), match='hei", "hej'>,
<_sre.SRE_Match object; span=(74, 86), match='great", you?'>]
In[342]:test='hello\r\n你,你好,你好,你好,“嘿嘿”,嘿\r\n你好,你好,你好,“嘿嘿”,“嘿,你好”,你
[343]中:[r代表r.finditer中的r(r'([^(\r\n)])+',test]
出[343]:
[,
,
,
,
,
]
因此,我们尝试了一种不同的方法:创建一种模式,找到我们想要排除的模式,然后尝试否定它:
In [344]: [r for r in re.finditer(r'(\r\n|\n)(?=(?:[^"]*"[^"]*")*[^"]*\Z)', test)]
Out[344]:
[<_sre.SRE_Match object; span=(6, 8), match='\r\n'>,
<_sre.SRE_Match object; span=(38, 40), match='\r\n'>]
[344]中的:[r代表r.finditer中的r(r'(\r\n |\n)(?=(?:[^”]*“[^”]*”[^”]*”*[^”]*\Z),测试)]
出[344]:
[,
]
但是我们不知道如何正确地否定它。我们使用re.finditer()
而不是re.split()
,因为我们想返回一个生成器。你可以使用([^”\r\n]*(?:“[^”]+“[^”\r\n]*)
这样,您将发现任何字符串都没有换行符,也没有可以在引号中后跟任意数量字符串的引号
将输出:
['hello ',
' you, hi, hola, "hei\nhei", hej',
'hello, hi, hola, "hei\nhei", "hej\r\ngreat", you?']
这听起来像是regex不太适合解析的任务。你会考虑使用诸如<代码> PyPARSUN 之类的东西吗?试试<代码> Re.FiDALL(R′(?):[^ ] ]“*”+,“测试”。正则表达式不适合嵌套逻辑。@WiktorStribiżew:您的解决方案实际上比我的好得多^^谢谢您提供了关于
pyparsing
@mgilson的提示,我不知道!这太棒了,@Faibbus!!!这正是我们需要的!我们刚刚发现,对于这个用例,它将删除新行:”\r\n“你好吗\r\n\r我很好\r\n你呢?\n独自一人在黑暗中\n\r\n清洗我\n\r杀了我”
[,…
而不是:,
。
好的,我没有处理你的线路以开头的情况。
.UpdatedThanks@Faibbus,我们将使用你的解决方案!
['hello ',
' you, hi, hola, "hei\nhei", hej',
'hello, hi, hola, "hei\nhei", "hej\r\ngreat", you?']