Требуется Python Regex Multiple Pattern Match и Anti Pattern Match Match - PullRequest
0 голосов
/ 14 июня 2019

У меня есть строка Python, которая имеет следующий шаблон данных.

(а) будет дано ХХХ для выборов по сценарию 3.3 (а). (b) Второе утверждение содержит раздел 4.2 (b), в котором может быть выбран сценарий 2.4 (a), потенциально

У меня может быть указанная выше строка шаблона, которую нужно разделить на (a) - (z), но она не должна разбиваться, если (a) - (z) происходит в середине оператора и, в частности, сценария XX ( a) до XX (z) не следует выбирать.

Мне нужно разделить как (2 строки)

  1. (а) будет дано ХХХ для выборов по сценарию 3.3 (а).

  2. (b) Второе утверждение содержит раздел 4.2 (b), в котором можно выбрать сценарий 2.4 (а) потенциально

Я пытаюсь сопоставить с шаблоном, используя python re

import re Patterns = ["[^ 0-9] (a)", "[^ 0-9] (b)", "[^ 0-9] (c)", "[^ 0-9 ] (d) "]

textData = "(a) будет дан XXX для его избрания в соответствии со сценарием 3.3 (a). (B) Во втором утверждении есть раздел 4.2 (b), который может выбрать для сценария 2.4 (a) потенциально" regexPattern = '|' .join (map (re.escape, Patterns)) splitList = re.split (regexPattern, textData) print (splitList)

Это вывод Iam, получаемый при выполнении

['(a) будет дано ХХХ для выборов по сценарию 3.3 (a). (b) Во втором утверждении есть раздел 4.2 (b), в котором может быть выбран сценарий 2.4 (a) потенциально ']

Пробел до и после '.' изменяется в предыдущем разделе, и новый раздел позволяет сказать (б) после того, как предыдущий раздел (а) начинается в новой строке.

1 Ответ

1 голос
/ 14 июня 2019

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

import re

s = "(a) be given by XXX for its election per scenario 3.3(a). (b) Second statement has a section 4.2(b) which might elect for scenario 2.4(a) potentially"

print(re.split(r"(?<=\.) (?=\([a-z]\))", s))

Вывод:

['(a) be given by XXX for its election per scenario 3.3(a).', 
 '(b) Second statement has a section 4.2(b) which might elect for scenario 2.4(a) potentially']

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


Другая идея: есливы гарантированно получите каждую букву алфавита для извлечения, уверены, что каждая буква будет отображаться в конце концов и по порядку, и хотите рассматривать что-либо не по порядку как нормальное содержимое, вы можете попробовать создать гигантское регулярное выражение:

import re
from string import ascii_lowercase

s = "(a) be given by XXX for its election per scenario 3.3(a). (b) Second statement has a section 4.2(b) which might elect for scenario 2.4(a) potentially. (c) blah blah  (c) blah blah (d) asd ad(a) (b) (e) ee (b) (a) (d) (f) (f) fff f ff (g) (a) gggg (h) hhhh (b) (i) iii i i (i) i (j) jjj (k) k (l) ll (a) (b) (x) (m) mm (n) nn (o) oo) () () (p) ppp (A) (B) (Q) (q) qq (r) rr (s) ss (t) tt( u ) (u) uu (v) vvv (ww) (w) ww (x) xx (y) yy (z) zzz"

pattern = "".join([f"((?: |^)\({l}\) .+)" for l in ascii_lowercase])

for result in re.findall(pattern, s)[0]:
    print(result.strip())

Вывод:

(a) be given by XXX for its election per scenario 3.3(a).
(b) Second statement has a section 4.2(b) which might elect for scenario 2.4(a) potentially. (c) blah blah
(c) blah blah
(d) asd ad(a) (b)
(e) ee (b) (a) (d) (f)
(f) fff f ff
(g) (a) gggg
(h) hhhh (b) (i) iii i i
(i) i
(j) jjj
(k) k
(l) ll (a) (b) (x)
(m) mm
(n) nn
(o) oo) () ()
(p) ppp (A) (B) (Q)
(q) qq
(r) rr
(s) ss
(t) tt( u )
(u) uu
(v) vvv (ww)
(w) ww
(x) xx
(y) yy
(z) zzz

Это все еще делает некоторые широкие предположения относительно ввода, но, возможно, стоило бы поиграть с ним;Считайте это доказательством концепции.

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

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