使用长的regex公式进行自由文本解析会导致错误:在python中重复多次?包括截图

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

编辑:我逃脱了'。在正则表达式中,但是我仍然遇到相同的错误。

为此,我使用了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)

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

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公式中以及每种单词的变体形式中都做了说明。例如,我考虑了line,Line,LINE,line,Line等。我分别测试了regex公式,它们工作正常。但是,当我在上面的代码中结合所有它们时,得到以下错误消息:

Error Message Screenshot

能帮我解决此问题吗?

还有,还有另一种方法可以同时解释同一单词的变体(小写,大写和标题大写)吗?

谢谢!

redroom88 回答:使用长的regex公式进行自由文本解析会导致错误:在python中重复多次?包括截图

在这种情况下的主要错误是由于您使用了所有格修饰符而不是常规的非所有格修饰符。

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

Python re不支持所有格限定符

{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_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.Ire.IGNORECASE参数编译正则表达式来使整个模式不区分大小写。这将“同时考虑相同单词的变体(小写,大写和标题大写)”。

注意:如果您确实想使用所有格量词,则可以在积极的前瞻和反向引用的帮助下emulate a possessive quantifier。但是,在Python中,您需要re.finditer才能访问整个匹配值。

本文链接:https://www.f2er.com/3150559.html

大家都在问