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

Редактировать: Я должен добавить, что строка в тесте должна содержать все возможные символы (т.е. * + $ § € / и т. Д.).Поэтому я подумал, что регулярное выражение должно помочь лучше всего.

Я использую регулярное выражение, чтобы найти все символы между определенными символами (["и"]. Мой пример выглядит так:

test = """["this is a text and its supposed to contain every possible char."], 
    ["another one after a newline."], 

    ["and another one even with
    newlines

    in it."]"""

Предполагаемый вывод должен быть таким:

['this is a text and its supposed to contain every possible char.', 'another one after a newline.', 'and another one even with newlines in it.']

Мой код, включая регулярное выражение, выглядит следующим образом:

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

И мой результат следующий:

['this is a text and its supposed to contain every possible char."]', 'another one after a newline."]', 'and another one even with']

, поэтому есть две проблемы:

1) он не удаляет "] в конце текста, как я хочу, чтобы он делал с (?="\])

2) он не захватывает третий текст в скобках, угадайте из-за перевода строки.Но до сих пор я не смог их запечатлеть, когда я попробую .*\n, он возвращает мне пустую строку.

Я благодарен за любую помощь или подсказки по этому вопросу.Заранее благодарим.

Кстати, используя Python 3.6 на anaconda-spyder и новейшее регулярное выражение (2018).

РЕДАКТИРОВАТЬ 2: Одно изменение в тесте:

test = """[
    "this is a text and its supposed to contain every possible char."
    ], 
    [
    "another one after a newline."
    ], 

    [
    "and another one even with
    newlines

    in it."
    ]"""

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

my_list = re.findall(r'(?<=\[\S\s\")[\w\W]*(?=\"\S\s\])', test)
print (my_list)

Но это возвращает толькопустой списокКак получить предполагаемый вывод выше из этого ввода?

Ответы [ 3 ]

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

Если вы также можете принять не регулярное выражение, вы можете попробовать

result = []
for l in eval(' '.join(test.split())):
    result.extend(l)

print(result)
#  ['this is a text and its supposed to contain every possible char.', 'another one after a newline.', 'and another one even with newlines in it.']
0 голосов
/ 04 декабря 2018

Итак, вот что я придумал:

test = """["this is a text and its supposed to contain every possible char."], 
    ["another one after a newline."], 

    ["and another one even with
    newlines

    in it."]"""

for i in test.replace('\n', '').replace('    ', ' ').split(','):
    print(i.lstrip(r' ["').rstrip(r'"]'))

Что приводит к тому, что на экран выводится следующее:

this is a text and its supposed to contain every possible char.
another one after a newline.
and another one even with newlines in it.

Если вы хотите получить список этих -точных строк,мы могли бы изменить его на -

newList = []
for i in test.replace('\n', '').replace('    ', ' ').split(','):
  newList.append(i.lstrip(r' ["').rstrip(r'"]'))
0 голосов
/ 04 декабря 2018

Вы можете попробовать этот помощник.

(?<=\[\")[\w\s.]+(?=\"\])

Демо

То, что вы пропустили в своем регулярном выражении .* не будет соответствовать символу новой строки.

PS Я не сопоставляю специальные символы.если вы хотите, это может быть достигнуто очень легко.

Этот символ также соответствует спецсимволам

(?<=\[\")[\w\W]+?(?=\"\])

Демо 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...