我该如何解决这个正则表达式逻辑错误?
How can i solve my this regex logical error?
代码-
df['Expiry'], df['Symbol'] = None, None
index_Ticker = df.columns.get_loc('Ticker')
index_Expiry = df.columns.get_loc('Expiry')
index_Symbol = df.columns.get_loc('Symbol')
Expiry_Pattern = r'-([A-Z]{1,3})'
Symbol_Pattern = r'(.*?)-[A-Z]{1,3}'
for row in range(0, len(df)):
Expiry = re.search(Expiry_Pattern, df.iat[row, index_Ticker]).group()
df.iat[row, index_Expiry] = Expiry
Symbol = re.search(Symbol_Pattern, df.iat[row, index_Ticker]).group()
df.iat[row, index_Symbol] = Symbol
我在这里使用这个正则表达式
Expiry_Pattern = r'-([A-Z]{1,3})'
Symbol_Pattern = r'(.*?)-[A-Z]{1,3}'
我的输出是 -
Output Image
而我的实际数据是这种格式-
ZEEL-III.NFO
RELIANCE-III.NFO
ADANIPORTS-I.NFO
ZEEL-II.
AARTIIND-III.NFO
但我想要输出 -
ZEEL III
RELIANCE III
ADANIPORTS I
ZEEL II
AARTIIND III
我不知道如何解决这个问题。
您可以使用正则表达式 '-?(\w+)(?=-|\.)'
来获得您拥有的示例数据的预期输出:
>>> df['col'].str.findall('-?(\w+)(?=-|\.)').apply(pd.Series)
0 1
0 ZEEL III
1 RELIANCE III
2 ADANIPORTS I
3 ZEEL II
4 AARTIIND III`
模式说明:
'-?(\w+)(?=-|\.)'
-?
将匹配开头出现的一个或零个连字符 -
(\w+)
捕获 word/substring
(?=-|\.)
是正向预测,以确保它以 -
或 .
结尾
非正则表达式解决方案:
先在.
右拆分字符串,最大拆分n
为1,然后取第一个索引处的值,在-
:
拆分
df['col'].str.rsplit('.', n=1).str[:-1].str[0].str.split('-').apply(pd.Series)
0 1
0 ZEEL III
1 RELIANCE III
2 ADANIPORTS I
3 ZEEL II
4 AARTIIND III
我提取值-
df["Symbol"] = df["Ticker"].str.extract('(.*?)-').apply(pd.Series)
df["Expiry"] = df["Ticker"].str.extract('-([A-Z]{1,3})').apply(pd.Series)
并创建两列。
现在我的输出也和我想要的一样。
Output Image
代码-
df['Expiry'], df['Symbol'] = None, None
index_Ticker = df.columns.get_loc('Ticker')
index_Expiry = df.columns.get_loc('Expiry')
index_Symbol = df.columns.get_loc('Symbol')
Expiry_Pattern = r'-([A-Z]{1,3})'
Symbol_Pattern = r'(.*?)-[A-Z]{1,3}'
for row in range(0, len(df)):
Expiry = re.search(Expiry_Pattern, df.iat[row, index_Ticker]).group()
df.iat[row, index_Expiry] = Expiry
Symbol = re.search(Symbol_Pattern, df.iat[row, index_Ticker]).group()
df.iat[row, index_Symbol] = Symbol
我在这里使用这个正则表达式
Expiry_Pattern = r'-([A-Z]{1,3})'
Symbol_Pattern = r'(.*?)-[A-Z]{1,3}'
我的输出是 - Output Image
而我的实际数据是这种格式-
ZEEL-III.NFO
RELIANCE-III.NFO
ADANIPORTS-I.NFO
ZEEL-II.
AARTIIND-III.NFO
但我想要输出 -
ZEEL III
RELIANCE III
ADANIPORTS I
ZEEL II
AARTIIND III
我不知道如何解决这个问题。
您可以使用正则表达式 '-?(\w+)(?=-|\.)'
来获得您拥有的示例数据的预期输出:
>>> df['col'].str.findall('-?(\w+)(?=-|\.)').apply(pd.Series)
0 1
0 ZEEL III
1 RELIANCE III
2 ADANIPORTS I
3 ZEEL II
4 AARTIIND III`
模式说明:
'-?(\w+)(?=-|\.)'
-?
将匹配开头出现的一个或零个连字符-
(\w+)
捕获 word/substring(?=-|\.)
是正向预测,以确保它以-
或.
结尾
非正则表达式解决方案:
先在.
右拆分字符串,最大拆分n
为1,然后取第一个索引处的值,在-
:
df['col'].str.rsplit('.', n=1).str[:-1].str[0].str.split('-').apply(pd.Series)
0 1
0 ZEEL III
1 RELIANCE III
2 ADANIPORTS I
3 ZEEL II
4 AARTIIND III
我提取值-
df["Symbol"] = df["Ticker"].str.extract('(.*?)-').apply(pd.Series)
df["Expiry"] = df["Ticker"].str.extract('-([A-Z]{1,3})').apply(pd.Series)
并创建两列。
现在我的输出也和我想要的一样。 Output Image