簡體   English   中英

使用 Python 中的正則表達式獲取特定字符串

[英]Get a specific string with Regex in 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

通過搜索 3 個字母后跟4-5數字來使用Series.str.extract

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

另一種在匹配后查找 2 -單獨子字符串的方法:

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

您可以使用以下正則表達式搜索 7 或 8 個重復的字母數字字符,其中 output 優先級較高:

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

如果您的數據在感興趣的子字符串之后更不規則,另一種可能的方法是拆分您的字符串並返回最長的 substring:

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

如果你必須使用正則表達式並且你的模式看起來像你展示的那樣,那么你也可以使用:

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

從右側開始計數,然后所有代碼都在第三個破折號中。 你可以做的是反轉字符串,然后在得到結果后再次反轉它。 如果格式不穩定,則找到其他方法,例如計算破折號之間的代碼長度,當它與要求匹配時,接受或打印它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM