首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自由文本解析使用长正则表达式导致错误:在python中多次重复?截图

自由文本解析使用长正则表达式导致错误:在python中多次重复?截图
EN

Stack Overflow用户
提问于 2019-11-06 16:17:12
回答 1查看 103关注 0票数 2

我需要解析.xlsx文件中自由文本字段中的特定字符串。我在Spyder中使用Python2.7。

我逃过了“在正则表达式中,但我仍然得到同样的错误。

为此,我使用熊猫将.xslx文件转换为熊猫数据文件:

代码语言:javascript
复制
data = "complaints_data.xlsx"
read_data = pd.read_excel(data)
read_data.dropna(inplace = False)
df = pd.DataFrame(read_data)
df['FMEA Assessment'] = df['FMEA Assessment'].replace({',':''}, regex=True)

然后,我使用熊猫的提取函数提取我的字符串字段FMEA,Rev和Line使用正则表达式。

代码语言:javascript
复制
fmea_pattern = r'(FMEA\s*\d*\d*\d*\d*\d*|fmea\s*\d*\d*\d*\d*\d*|DOC\s*\-*[0]\d*\d*\d*\d*\d*|doc\s*\-*[0]\d*\d*\d*\d*\d*)'
df[['FMEA']] = df['FMEA Assessment'].str.extract(fmea_pattern, expand=True)
    
rev_pattern = r'(Rev\.*\s+\D{1,2}+|rev\.*\s+\D{1,2}|REV\.*\s+\D{1,2}|rev\.*\s+\D{1,2})'
df[['REV']] = df['FMEA Assessment'].str.extract(rev_pattern, expand=True)
    


line_pattern = r'(line item\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|Line\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|lines\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|Lines\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|Line item\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|LINES\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|LINE\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.)'
df[['LINE']] = df['FMEA Assessment'].str.extract(line_pattern, expand=True)   

我需要解析的字符串字段可以以各种方式输入,我在regex公式中对每一种方式进行了解释,并对一个单词的每一个变体进行了解释;例如,我计算了行、行等。我分别测试了regex公式,它们正在正常工作。但是,当我将它们合并到上面的代码中时,我会得到以下错误消息:

另外,是否有另一种方法可以同时解释同一个单词的变化(小写、大写和标题大写)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-06 18:33:15

本例中的主要错误是由于您使用的是占有式量词,而不是常规的、非占有式量词。

当用户在在线PCRE regex测试器中测试他们的模式时,这是一个常见的错误。您需要确保始终在与目标环境兼容的环境(或regex引擎选项)中测试regex。

re 不支持拥有式量词

代码语言:javascript
复制
{5}+
{5,}+
{5,10}+
++
?+
*+

在本例中,您只需从+ \D{1,2}+中移除尾随的即可。

代码语言:javascript
复制
rev_pattern = r'(Rev\.*\s+\D{1,2}|rev\.*\s+\D{1,2}|REV\.*\s+\D{1,2}|rev\.*\s+\D{1,2})'

看来你可以用

代码语言:javascript
复制
rev_pattern = r'((?:[Rr]ev|REV)\.*\s+\D{1,2})' # Will only match Rev, REV and rev at the start
rev_pattern = r'(?i)(Rev\.*\s+\D{1,2})' # Will match any case variations of Rev

请参阅regex演示 at Regex101,注意左边选择的Python选项。

另外,请注意,通过在模式开始时添加(?i),或者通过使用re.Ire.IGNORECASE参数编译正则表达式,可以使整个模式不区分大小写。这将“解释同一时间同一个单词的变化(小写、大写和标题大写)”。

注意到:如果您实际上是在使用拥有式量词,您可以借助正的前瞻性和反向引用的帮助,模仿所有格量词。但是,在Python中,您需要re.finditer来访问整个匹配值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58734438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档