需要Python Regex多种模式匹配和反模式匹配

时间:2019-06-14 05:39:35

标签: python regex

我有一个python字符串,具有以下数据模式。

  XXX将根据场景3.3(a)选举

(a)。 (b)第二个陈述的第4.2(b)节可能会选择方案2.4(a)

我可能有上述模式的字符串,需要用(a)到(z)分割,但是如果在语句的中间,特别是场景XX( a)不应选择XX(z)。

我需要将其拆分为(2行)

    XXX给出
  1. (a),以根据场景3.3(a)进行选举。

  2. (b)第二条陈述有第4.2(b)条,该条可以选择 情况2.4(a)

我正在尝试使用python re模式匹配

import re pattern = [“ [^ 0-9](a)”,“ [^ 0-9](b)”,“ [^ 0-9](c)”,“ [^ 0-9 ](d)“]

XXX给出

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)由XXX给出,根据方案3.3(a)进行选举。 (b)第二个陈述的第4.2(b)节可能选择了方案2.4(a)''

“。”前后的空格。在上一节中有所不同,在上一节(a)以新行开始之后,新一节中说(b)。

1 个答案:

答案 0 :(得分:1)

尽管您的要求有点模糊,但鉴于您的特定输入字符串,合理的选择似乎是在任何以空格.开头并以文字(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

这仍然对输入有一些笼统的假设,但可能值得一试。认为这是概念证明。

换行符是另一个需要考虑的问题(如果存在的话)。长话短说,与正则表达式相比,手工编写解析器可能是更好的选择。