Python 2.7: сопоставление выражения с использованием регулярных выражений - PullRequest
3 голосов
/ 26 апреля 2019

у меня ниже строки:

asc_epsWarn_mu8                  # I want asc and epsWarn 
asc_ger_phiK_mi16                # I want asc and ger_Phik
ARSrt_FAC_RED5_DSR_AU16            # I want ARSrt and FAC_RED5_DSR    

В основном я хочу, чтобы символы перед первым _ в одной группе и все символы между первым и последним подчеркиванием _ во второй группе.

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

(\w+)_(\w+)_(\w+)

Но это не работает. Что может быть правильным регулярным выражением?

Ответы [ 3 ]

3 голосов
/ 26 апреля 2019

Вы можете использовать это регулярное выражение с 2 группами захвата:

^([^_]+)_(.+)_[^_]*$

Демонстрация RegEx

Подробности RegEx:

  • ^: начало
  • ([^_]+): группа захвата # 1 соответствует 1+ не подчеркивающим символам
  • _: соответствует -
  • (.+): захватить группу # 2 для соответствия 1+ любого персонажа до следующего матча
  • _: сопоставить -
  • [^_]*: сопоставить 0 или более несимволы подчеркивания
  • $: конец
3 голосов
/ 26 апреля 2019

Символ слова \w Также соответствует подчеркиванию.

Если вы хотите сопоставить символы слова без подчеркивания, вы можете использовать класс символов с отрицанием и сопоставить непробельный символ без подчеркивания [^\W_]

Вы можете использовать 2 группы захвата сповторяющийся шаблон для второй группы:

^([^\W_]+)_((?:[^\W_]+_)*)[^\W_]+$
  • ^ Начало строки
  • ([^\W_]+)_ Совпадение 1+ раз слово char, кроме подчеркивания в группе 1, совпадение подчеркивания
  • ( Группа захвата 2
    • (?:[^\W_]+_)* Повторите 0+ раз, сопоставляя слово char, за исключением подчеркивания, затем подчеркивание
  • )Закрыть группу 2
  • [^\W_]+ Совпадение 1+ раз слово char, кроме знака подчеркивания
  • $ Конец строки

Regex demo

2 голосов
/ 26 апреля 2019

Попробуйте использовать этот шаблон:

([^_]+)_(.*)_.*

Пример сценария:

input = "ARSrt_FAC_RED5_DSR_AU16"
matches = re.match(r'([^_]+)_(.*)_.*', input)
if matchObj:
    print "part1: ", matches.group(1)
    print "part2: ", matches.group(2)

part1:  ARSrt
part2:  FAC_RED5_DSR

Вот краткое объяснение шаблона регулярных выражений:

([^_]+) match and capture the term before the first underscore
_       match a literal underscore
(.*)    then greedily match and consume everything up until the last undescore
_       match the last underscore
.*      consume the remainder of the string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...