Найдите что-то, что не соответствует шаблону в начале строки - PullRequest
0 голосов
/ 23 октября 2019

Я использую регулярное выражение в Python, чтобы найти что-то в начале строки, которая не соответствует шаблону "SCENE" и перед двоеточием. Текст выглядит следующим образом:

SCENE:xxxxxxdd\nAQW:xxxxxdd\nSCENE:xxxxxdf\nCER:dddd.ddd\nddd\nDYU:ddddd\nddd\nd\nEOI:ddd\n.

В этом случае мне нужно найти AQW, CER, DYU, EOI.

Я пытался

findall(r"^(?!SCENE)[^:]*, text, re.M)

Я получаю AQWи EOI, но я получаю ddd\nDYU вместо DYU, ddd\nd\nEOI вместо EOI.

Как я могу получить точно AQW, CER, DYU, EOI?

Ответы [ 4 ]

0 голосов
/ 25 октября 2019

В этом случае вам не нужно регулярное выражение. Вот решение с использованием простого и простого str.split().

s = 'SCENE:xxxxxxdd\nAQW:xxxxxdd\nSCENE:xxxxxdf\nCER:dddd.ddd\nddd\nDYU:ddddd\nddd\nd\nEOI:ddd\n.'
matches = [m.split('\n')[-1] for m in s.split(':') if 'SCENE' not in m]
>>> matches
['AQW', 'CER', 'DYU', 'EOI', '.']

Если вы хотите исключить последние '.', вы можете использовать matches = [m.split('\n')[-1] for m in s.split(':') if (('SCENE' not in m) and (m[-1] != '.'))] или просто matches = matches[:-1]

0 голосов
/ 23 октября 2019

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

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

findall( r"([A-Z]+(?<!SCENE):(?:[\s\S](?!\n[A-Z]+:))+.)", text )

https://regex101.com/r/NwdUcR/2

РЕДАКТИРОВАТЬ: я понимаю, что выше можетне совсем то, что вы ищете. Если вы хотите сопоставить только буквы перед двоеточием, вы можете использовать это:

findall( r"([A-Z]+(?<!SCENE)):", text )
0 голосов
/ 23 октября 2019

Я использую

findall (r"\n(?!SCENE)(.+?):")

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

0 голосов
/ 23 октября 2019

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

import re
line = "SCENE:xxxxxxdd\nAQW:xxxxxdd\nSCENE:xxxxxdf\nCER:dddd.ddd\nddd\nDYU:ddddd\nddd\nd\nEOI:ddd\n."
lines = re.split("\\n([A-Z])", line)
lines = [a+b for a,b in zip(lines[1::2], lines[2::2])]
for line in lines:
    if re.match(r"^(?!SCENE)[^:]*", line):
        print(line.split(":")[0])

Результат:

AQW
CER
DYU
EOI

Этот ответ не лучший с точки зрения производительностиЯ предполагаю

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