如何将Pandas DataFrame文本列转为单行并提取所有[*].[*]模式的数据?
Pandas文本提取问题解决方案
1. 将多行文本转换为单行
直接通过正则替换把所有换行、连续空白字符替换成单个空格,即可将列内容转为单行:
df['txt'] = df['txt'].str.replace('\s+', ' ', regex=True)
该操作会把原文本中的换行、多空格统一压缩成单个空格,让文本结构更规整,也能避免多行对正则匹配的干扰。
2. 提取所有符合[*].[*]模式的数据
你之前的正则\[.*\]是贪婪匹配,会从第一个[一直匹配到最后一个],导致只返回一个结果。需要改用精准匹配单个[xxx].[yyy]单元的正则:
df['matches'] = df['txt'].str.findall(r'\[[^\]]+\]\.\[[^\]]+\]').str.join(', ')
正则说明:
\[[^\]]+\]:匹配以[开头、]结尾的片段,[^\]]+确保只匹配到第一个],不会跨多个片段\.\:匹配中间的.(正则中.是通配符,必须转义)
完整示例代码
import pandas as pd df = pd.DataFrame({'txt': ["sample text [EN1].[attrgs] when x=1 then 1 else [EN2].[abc] testing [EN3].[BUS] WHERE [EN1].[attrgs] = abc"]}) # 转换为单行文本 df['txt'] = df['txt'].str.replace('\s+', ' ', regex=True) # 提取所有匹配项 df['matches'] = df['txt'].str.findall(r'\[[^\]]+\]\.\[[^\]]+\]').str.join(', ') # 可选:对匹配项去重 df['matches_unique'] = df['txt'].str.findall(r'\[[^\]]+\]\.\[[^\]]+\]').apply(set).str.join(', ') print(df['matches'].iloc[0]) # 输出:[EN1].[attrgs], [EN2].[abc], [EN3].[BUS], [EN1].[attrgs] print(df['matches_unique'].iloc[0]) # 输出:[EN1].[attrgs], [EN2].[abc], [EN3].[BUS]
内容的提问来源于stack exchange,提问作者kmr
相关产品推荐
相关产品推荐

