Извлеките строку формы слова, используя границы слова регулярного выражения в python - PullRequest
2 голосов
/ 21 мая 2019

Предположим, у меня есть такое имя файла, и я хочу извлечь его часть в виде строки в Python

import re
fn = "DC_QnA_bo_v.15.12.3_DE_duplicates.xlsx"
rgx = re.compile('\b_[A-Z]{2}\b')
print(re.findall(rgx, fn))

Ожидаемый результат - [DE], но фактический - [].

Ответы [ 6 ]

2 голосов
/ 21 мая 2019

Вы можете использовать

(?<=_)[A-Z]+(?=_)

Это позволяет использовать обходные пути с обеих сторон, см. демонстрацию на regex101.com .Чтобы получить более точные результаты, вам нужно будет указать больше входных данных.

1 голос
/ 21 мая 2019

Вы можете использовать для этого регулярное выражение (re module), как уже показано, однако это можно сделать без использования import s следующим образом:

fn = "DC_QnA_bo_v.15.12.3_DE_duplicates.xlsx"
out = [i for i in fn.split('_')[1:] if len(i)==2 and i.isalpha() and i.isupper()]
print(out) # ['DE']

Объяснение: I split fn at _, затем отбросьте 1-й элемент и фильтрующие элементы, чтобы остались только str s длины 2, состоящие из букв и состоящие из заглавных букв.

1 голос
/ 21 мая 2019

Попробуйте шаблон: \_([^\_]+)\_[^\_\.]+\.xlsx

Объяснение:

\_ - соответствует _ буквально

[^\_]+ - отрицательный класс символов с оператором +: соответствует одному или нескольким символам, отличным от _

[^\_\.]+ - то же, что и выше, но на этот раз соответствует символам, отличным от _ и .

\.xlsx -соответствовать .xlsx буквально

Демо

Идея состоит в том, чтобы соответствовать последнему шаблону _something_ перед расширением .xlsx

1 голос
/ 21 мая 2019

Ваш желаемый результат, кажется, DE, который ограничен двумя _ слева и справа. Это выражение также может работать:

# -*- coding: UTF-8 -*-
import re

string = "DC_QnA_bo_v.15.12.3_DE_duplicates.xlsx"
expression = r'_([A-Z]+)_'
match = re.search(expression, string)
if match:
    print("YAAAY! \"" + match.group(1) + "\" is a match ??? ")
else: 
    print('? Sorry! No matches!')

выход

YAAAY! "DE" is a match ???

Или вы можете добавить 2 квантификатор, если хотите:

# -*- coding: UTF-8 -*-
import re

string = "DC_QnA_bo_v.15.12.3_DE_duplicates.xlsx"
expression = r'_([A-Z]{2})_'
match = re.search(expression, string)
if match:
    print("YAAAY! \"" + match.group(1) + "\" is a match ??? ")
else: 
    print('? Sorry! No matches!')

enter image description here

DEMO

1 голос
/ 21 мая 2019

Использование _([A-Z]{2})

Ex:

import re
fn = "DC_QnA_bo_v.15.12.3_DE_duplicates.xlsx"
rgx = re.compile('_([A-Z]{2})')
print(rgx.findall(fn))           #You can use the compiled pattern to do findall. 

Выход:

['DE']
0 голосов
/ 21 мая 2019

Другое re решение:

rgx = re.compile('_([A-Z]{1,})_')
print(re.findall(rgx, fn))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...