使用负正则表达式模式拆分字符串

wqsoz72f  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(417)

我想用非字母数字字符(除了一个特定的模式)来分割sting。
例子:

string_1 = "section (ab) 5(a)"
string_2 = "section -bd, 6(1b)(2)"
string_3 = "section - ac - 12(c)"
string_4 = "Section (ab) 5(1a)(cf) (ad)"
string_5 = "section (ab) 5(a) test (ab) 5 6(ad)"

我想以某种方式拆分这些字符串,以便得到下面的输出

["section", "ab", "5(a)"]
["section", "bd", "6(1b)(2)"]
["section", "ac", "12(c)"]
["section", "ab", "5(1a)(cf)", "ad"]
["section", "ab", "5(a)", "test", "ab, "5", "6(ad)"]

更准确地说,我想把每一个非字母数字字符,除了这个 \d+([\w\(\)]+) 图案。

46qrfjad

46qrfjad1#

你可以用

\d+[\w()]+|\w+

查看regex演示。
细节 \d+[\w()]+ -1+位,然后1+字或 ( 或者 ) 字符 | -或者 \w+ -1+字字符。
在elasticsearch中,使用

"tokenizer": {
  "my_tokenizer": {
    "type": "pattern",
    "pattern": "\\d+[\\w()]+|\\w+",
    "group": 0
  }
}
nzkunb0c

nzkunb0c2#

它可以在这个regex里面实现 findall 使用:

\b\w+(?:\([^)]*\))*

正则表达式演示
代码:

>>> import re
>>> reg = re.compile(r'\b\w+(?:\([^)]*\))*')
>>> arr = ['section (ab) 5(a)', 'section -bd, 6(1b)(2)', 'section - ac - 12(c)', 'Section (ab) 5(1a)(cf) (ad)', 'section (ab) 5(a) test (ab) 5 6(ad)']
>>> for el in arr:
...     print ( reg.findall(el) )
...
['section', 'ab', '5(a)']
['section', 'bd', '6(1b)(2)']
['section', 'ac', '12(c)']
['Section', 'ab', '5(1a)(cf)', 'ad']
['section', 'ab', '5(a)', 'test', 'ab', '5', '6(ad)']

相关问题