我该如何解决这个正则表达式逻辑错误?

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