Python - Regex - сопоставить символы между определенными символами - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть текстовый файл, и я хочу сопоставить / найти все / разобрать все символы, которые находятся между определенными символами ( [\ n " текст для соответствия " \ n]).Сам текст может сильно отличаться друг от друга в отношении структуры и символов, которые они содержат (они могут содержать все возможные символы).

Я уже писал этот вопрос (извините за дубликат), но покапроблема не может быть решена, поэтому теперь я пытаюсь быть еще более точным в этой проблеме.

Текст в файле выглядит так:

    test =""" 
        [
        "this is a text and its supposed to contain every possible char."
        ], 
        [
        "like *.;#]§< and many "" more."
        ], 
        [
        "plus there are even
newlines

in it."
        ]"""

Мой желаемый вывод долженбыть списком (например) с каждым текстом между разделителями в качестве элемента, например:

['this is a text and its supposed to contain every possible char.', 'like *.;#]§< and many "" more.', 'plus there are even newlines in it.']

Я пытался решить его с помощью Regex и двух решений с соответствующим выводом, которые я придумал:

my_list = re.findall(r'(?<=\[\n {8}\").*(?=\"\n {8}\])', test)
print (my_list)

['this is a text and its supposed to contain every possible char.', 'like *.;#]§< and many "" more.']

ну, этот был близко.В нем перечислены первые два элемента, как предполагается, но, к сожалению, нет третьего, поскольку в нем есть новые строки.

my_list = re.findall(r'(?<=\[\n {8}\")[\s\S]*(?=\"\n {8}\])', test)
print (my_list)

['this is a text and its supposed to contain every possible char."\n        ], \n        [\n        "like *.;#]§< and many "" more."\n        ], \n        [\n        "plus there are even\nnewlines\n        \n        in it.']

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

Так что же правильно использовать Regex для получения желаемого результата?Почему во втором подходе нет предвидения?

Или есть даже более чистый и быстрый способ получить то, что я хочу (Beautifulsoup или другие методы?)?

Я очень благодарен за любыеПомощь и подсказки.

Я использую Python 3.6.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

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

(?s)\[[^"]*"(.*?)"[^]"]*\]

, чтобы захватить каждый элемент в пределах " s внутри скобок:

https://regex101.com/r/SguEAU/1

Затем вы можетеиспользуйте понимание списка с re.sub, чтобы заменить пробельные символы (включая символы новой строки) в каждой захваченной подстроке одним нормальным пробелом:

test ="""
    [
    "this is a text and its supposed to contain every possible char."
    ],
    [
    "like *.;#]§< and many "" more."
    ],
    [
    "plus there are even
newlines

in it."
    ]"""

output = [re.sub('\s+', ' ', m.group(1)) for m in re.finditer(r'(?s)\[[^"]*"(.*?)"[^]"]*\]', test)]

Результат:

['this is a text and its supposed to contain every possible char.', 'like *.;#]§< and many "" more.', 'plus there are even newlines in it.']
0 голосов
/ 07 декабря 2018

Вы должны использовать DOTALL флаг для соответствия новых строк

print(re.findall(r'\[\n\s+"(.*?)"\n\s+\]', test, re.DOTALL))

Вывод

['this is a text and its supposed to contain every possible char.', 'like *.;#]§< and many "" more.', 'plus there are even\nnewlines\n\nin it.']
...