[英]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.