#regex #elasticsearch
#регулярное выражение #elasticsearch
Вопрос:
Я хочу разделить 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()] )
шаблона .
Комментарии:
1. Вы не уверены, как должно выглядеть регулярное выражение? Что вы пробовали?
2. @Chiperific , я не уверен в регулярных выражениях, поэтому я попробовал
W(?!(d ([w()] )))
Ответ №1:
Это может быть достигнуто в этом регулярном выражении внутри findall
с помощью:
bw (?:([^)]*))*
Демонстрация регулярных выражений
Код:
>>> import re
>>> reg = re.compile(r'bw (?:([^)]*))*')
>>> 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)']
Комментарии:
1. но это не удаление
()
из string_1 . выводstring_1
должен быть["section", "ab", "5(a)"]
вместо['section', '(ab)', '5(a)']
2. это применимо только для примеров строк, но оно не работает с
section (ab) 5(a) test (ab) 5
orSection (ab) 5(1a)(cf) (ad)
.извините, я думаю, мне следовало добавить больше примеров строк. я обновил свой вопрос дополнительными примерами3. @Aninda: Это сработало или вам нужно только разделенное регулярное выражение?
4. на самом деле мне нужно разделенное регулярное выражение для Elasticsearch (pattern tokenizer), так
findall
что это не вариант для меня. ваше[()]?[^w()] ?[()]?
регулярное выражение мне очень помогло, спасибо5. о, тогда вы должны были пометить ее
Elasticsearch
вместоpython
илиpython3
, чтобы получить еще лучший ответ
Ответ №2:
Вы можете использовать
d [w()] |w
Смотрите демонстрацию регулярных выражений.
Подробные сведения
d [w()]
— 1 цифры, а затем 1 слово или(
или)
символы|
— илиw
— символы 1 word.
В ElasticSearch используйте
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": "\d [\w()] |\w ",
"group": 0
}
}
Комментарии:
1. я ищу одно регулярное выражение и не хочу использовать
findall
2.@Aninda Здесь есть одно
r'd [w()] |w '
регулярное выражение. А если нетre.findall
, то какой метод вы планируете использовать (и зачем ограничивать его работу только с каким-то конкретным методом)? Обратите внимание, что здесь нет способа использоватьre.split
, потому что вы не можете пропускать последовательности шаблонов сre
регулярным выражением. Однако это возможно сregex
помощью модуля PyPI.3. @Aninda Если вы используете подход разделения регулярных выражений PyPI, вы иногда будете получать пустые элементы на выходе, см. демонстрацию . Я бы предпочел придерживаться
re.findall
.4. мне нужен этот шаблон регулярных выражений, потому что я буду использовать их с Elasticsearch (pattern tokenizer), так что нет
re.findall
для меня. хотя ваше регулярное выражение мне очень помогло, спасибо