Как скопировать последующий текст после сопоставления с шаблоном? - PullRequest
2 голосов
/ 10 октября 2019

У меня есть текстовый файл, каждая строка которого выглядит примерно так -

GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4

В каждой строке есть ключевое слово testcaseid, за которым следует некоторый идентификатор тестового примера (в данном случае blt12_0001 - это идентификатор и s3 и n4 - некоторые параметры). Я хочу извлечь blt12_0001 из вышеуказанной строки. Каждый testcaseid будет иметь ровно 1 символ подчеркивания «_» между ними. Что было бы регулярным выражением для этого случая и как я могу сохранить имя идентификатора тестового примера в переменной.

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

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

testcaseid_([^_]+_[^_]+)

См. демонстрацию на regex101.com .


Одним из многих возможных способов в Python может быть
import re

line = "GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4"

for id in re.finditer(r'testcaseid_([^_]+_[^_]+)', line):
    print(id.group(1))

См. демо на ideone.com .

0 голосов
/ 10 октября 2019

Другой вариант, который может работать:

import re
expression = r"[^_\r\n]+_[^_\r\n]+(?=(?:_[a-z0-9]{2}){2}$)"

string = '''

GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4
GeneralBKT_n24_-e_dee_testcaseid_blt81_0023_s4_n5

'''

print(re.findall(expression, string, re.M))

Выход

['blt12_0001', 'blt81_0023']

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

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here


Если вы хотите упростить / изменить / изучить выражение,это было объяснено на верхней правой панели regex101.com . Если хотите, вы можете также посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


0 голосов
/ 10 октября 2019

Вы можете использовать это регулярное выражение для захвата вашего testcaseid, заданного в вашем формате,

(?<=testcaseid_)[^_]+_[^_]+

По сути, это захватывает текст, имеющий ровно одно подчеркивание между ними, и перед ним стоит testcaseid_ текст с использованием положительного взгляда сзади. Здесь [^_]+ захватывает один или несколько символов, отличных от подчеркивания, за которыми следует _, затем снова используется [^_]+ для захвата одного или нескольких символов, кроме _

Проверьте эту демонстрацию

Проверьте этот код Python,

import re

list = ['GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4', 'GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s6_n9']

for s in list:
 grp = re.search(r'(?<=testcaseid_)[^_]+_[^_]+', s)
 if grp:
  print(grp.group())

Выход,

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