Получить определенную строку с помощью Regex в Python

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

ART-B-C-ART0015-D-E01
ADC-B-C-ADC00112-V-E01
AEE-B-C-AEE00011-D-E01
AQW-B-C-AQW0013-D-E01
AAZ-B-C-AAZ0014-D-E01
AQQ-B-C-AQQ0032-D-E01
ADD-B-C-D-ADD0001-D-E01
AAA-B-C-AAA0012-D-E01

Я хочу получить следующий результат: Ожидаемый результат:

ART0015
ADC00112
AEE00011
AQW0013
AAZ0014
AQQ0032
ADD0001
AAA0012

Я использовал приведенный ниже код регулярного выражения и, к сожалению, не получил ожидаемого результата, поскольку 7-я запись не находится в третьем тире. это в четвертом тире.

df["A"].str.extract(r'^(?:[^-]*-){3}\s*([^-]+)', expand=False)

0     ART0015
1    ADC00112
2    AEE00011
3     AQW0013
4     AAZ0014
5     AQQ0032
6        D
7     AAA0012

Тогда каково правило определения извлекаемой подстроки?

Barbaros Özhan 12.12.2020 09:43

Есть ли правило, что оно должно быть после 3-го или 4-го тире выше определенного порога символов? Это связано с 3 буквенными символами, за которыми следуют 4 или 5 цифровых символов? Или есть правило, что вы ищете строки только выше или между определенным количеством символов, независимо от местоположения? Проверьте мой ответ для последнего.

David Erickson 12.12.2020 09:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
479
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Используйте Series.str.extract, выполнив поиск по 3 буквам, за которыми следуют 4-5 цифры:

In [477]: df['col'] = df['col'].str.extract(r'([a-zA-Z]{3}\d{4,5})')

In [478]: df
Out[478]: 
0   ART0015
1  ADC00112
2  AEE00011
3   AQW0013
4   AAZ0014
5   AQQ0032
6   ADD0001
7   AAA0012

начните считать с правой стороны, тогда все коды будут в третьем тире. Что вы можете сделать, так это изменить строку, а затем, получив результат, снова изменить ее. Если формат нестабилен, найдите другой способ, например, подсчитайте длину кода между тире и, когда он соответствует требуемому, примите его или распечатайте.

НЕТ Я думаю, что это работает нормально. Не могли бы вы, пожалуйста, дайте мне знать, как повернуть вспять?

Sara Daniel 12.12.2020 09:49

@СараДэниел df['A'] = df['A'].apply(lambda x: x[::-1])

David Erickson 12.12.2020 12:32

Я думаю, теперь вы поняли, извините за поздний ответ

user14779395 13.12.2020 07:12

Вы можете использовать следующее регулярное выражение для поиска 7 или 8 повторяющихся буквенно-цифровых символов с приоритетом вывода:

df['A'] = df['A'].str.extract('-([A-Za-z0-9]{7,8})-')

      A
0   ART0015
1   ADC00112
2   AEE00011
3   AQW0013
4   AAZ0014
5   AQQ0032
6   ADD0001
7   AAA0012

Похоже, вам вообще не нужны регулярные выражения. Почему бы вам просто не разделить строку и получить от третьего до последнего элемента в строке:

df["A"].str.split('-').str[-3]

Пример:

import pandas as pd

d = {'A': ['ART-B-C-ART0015-D-E01', 'ADC-B-C-ADC00112-V-E01']}
df = pd.DataFrame(data=d)
df['A'] = df["A"].str.split('-').str[-3]

print(df)

Отпечатки:

          A
0   ART0015
1  ADC00112

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

df['A']= df['A'].apply(lambda s: max(s.split('-'), key=len))

И если вы должны использовать регулярные выражения и ваши шаблоны выглядят так, как вы показали, вы также можете использовать:

df['A']= df['A'].str.extract(r'([^-]{4,})')

Другой подход, который ищет 2 - отдельных подстроки после вашего совпадения:

>>> df['A'].str.extract(r'([^-]+)(?:-[^-]*){2}$')
          0
0   ART0015
1  ADC00112
2  AEE00011
3   AQW0013
4   AAZ0014
5   AQQ0032
6   ADD0001
7   AAA0012

Другие вопросы по теме