Разделение строк с использованием регулярных выражений с шаблоном, присутствующим в тексте - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть много строк, которые мне нужно разделить запятыми.Пример:

myString = r'test,Test,NEAR(this,that,DISTANCE=4),test again,"another test"'
myString = r'test,Test,FOLLOWEDBY(this,that,DISTANCE=4),test again,"another test"'

Мой желаемый результат будет:

["test", "Test", "NEAR(this,that,DISTANCE=4)", "test again", """another test"""] #list length = 5

Я не могу понять, как сохранить запятые между "this, that, DISTANCE" в одном элементе.Я попробовал это:

l = re.compile(r',').split(myString) # matches all commas
l = re.compile(r'(?<!\(),(?=\))').split(myString) # (negative lookback/lookforward) - no matches at all

Есть идеи?Допустим, список разрешенных «функций» определяется как:

f = ["NEAR","FOLLOWEDBY","AND","OR","MAX"]

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Если вы хотите явно указать, какие строки считаются функциями, вам необходимо динамически построить регулярное выражение.В противном случае используйте решение Виктора.

>>> functions = ["NEAR","FOLLOWEDBY","AND","OR","MAX"]
>>> funcs = '|'.join('{}\([^\)]+\)'.format(f) for f in functions)
>>> regex = '({})|,'.format(funcs)
>>>
>>> myString1 = 'test,Test,NEAR(this,that,DISTANCE=4),test again,"another test"'
>>> list(filter(None, re.split(regex, myString1)))
['test', 'Test', 'NEAR(this,that,DISTANCE=4)', 'test again', '"another test"']
>>> myString2 = 'test,Test,FOLLOWEDBY(this,that,DISTANCE=4),test again,"another test"'
>>> list(filter(None, re.split(regex, myString2)))
['test',
 'Test',
 'FOLLOWEDBY(this,that,DISTANCE=4)',
 'test again',
 '"another test"']
0 голосов
/ 22 ноября 2018

Вы можете использовать

(?:\([^()]*\)|[^,])+

См. демонстрационное выражение regex .

Шаблон (?:\([^()]*\)|[^,])+ соответствует одному или нескольким вхождениям любой подстроки в скобках без ( и ) в них или любом другом символе, кроме ,.

См. Python demo :

import re
rx = r"(?:\([^()]*\)|[^,])+"
s = 'test,Test,NEAR(this,that,DISTANCE=4),test again,"another test"'
print(re.findall(rx, s))
# => ['test', 'Test', 'NEAR(this,that,DISTANCE=4)', 'test again', '"another test"']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...