Мы хотим группировать символы вместе между разрывами строк (\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 [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'>]
Но мы не можем понять, как правильно его отрицания. Мы используем re.finditer()
, а не re.split()
, потому что хотим вернуть генератор.
Это звучит как своего рода задачи, которые регулярное выражение не особенно хорошо подходит для анализа. Не могли бы вы вместо этого использовать что-то вроде 'pyparsing'? – mgilson
Попробуйте 're.findall (r '(?:" [^ "] *" |.) +', Test) '. –
Регулярные выражения плохо подходят для логики вложенности. – khelwood