本文介绍了使用长正则表达式的自由文本解析导致错误:在Python中多次重复?包含屏幕截图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要从.xlsx文件的自由文本字段中解析特定字符串。我在Spyder中使用的是Python2.7。
我逃过了‘.’在regex公式中,但我仍然收到相同的错误。
为此,我使用Pandas将.xslx文件转换为Pandas数据帧:
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)
然后,我使用Pandas的提取函数使用正则表达式模式提取我的字符串字段FMEA、REV和Line。
fmea_pattern = r'(FMEAs*d*d*d*d*d*|fmeas*d*d*d*d*d*|DOCs*-*[0]d*d*d*d*d*|docs*-*[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)
我需要分析的字符串字段可以通过各种方式输入,我考虑了正则表达式公式中的每种方式以及单词的每一种变体;例如,我考虑了Line、Lines、Lines等。我已经分别和单独测试了regex公式,它们工作正常。但是,当我在上面的代码中将它们组合在一起时,我得到以下错误消息:
还有,有没有其他方法可以同时解释同一个单词的变化(小写、大写和标题大写)?
推荐答案
这种情况下的主要错误是因为您使用的是所有格限定词,而不是规则的非所有格限定词。
当用户在在线PCRE正则表达式测试器中测试他们的模式时,这是一个常见的错误。您需要确保始终在与目标环境兼容的环境(或使用regex引擎选项)中测试regexp。
Pythonre
不支持所有格限定符:
{5}+
{5,}+
{5,10}+
++
?+
*+
在这种情况下,只需从D{1,2}+
中删除尾部+
:
rev_pattern = r'(Rev.*s+D{1,2}|rev.*s+D{1,2}|REV.*s+D{1,2}|rev.*s+D{1,2})'
您似乎可以直接使用
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
请参阅Regex101中的regex demo,注意左侧选中的Python
选项。
(?i)
,或者使用re.I
或re.IGNORECASE
参数编译正则表达式,可以使整个模式不区分大小写。这将"同时考虑同一单词的变化(小写、大写和标题大写)"。
注意:如果您实际上希望使用所有格量词,您可以emulate a possessive quantifier借助积极的前瞻和回溯。但是,在Python中,您需要re.finditer
才能访问整个匹配值。
这篇关于使用长正则表达式的自由文本解析导致错误:在Python中多次重复?包含屏幕截图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!