Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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_Quotes_Regex Negation - Fatal编程技术网

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?']