python - 使用长正则表达式公式进行自由文本解析导致错误 : multiple repeat in python? 包含屏幕截图

标签 python regex pandas parsing spyder

我需要从 .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)

然后,我使用 pandas 的提取函数使用正则表达式模式提取字符串字段 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)   

   

我需要解析的字符串字段可以通过多种方式输入,并且我在正则表达式公式中考虑了每种方式以及单词的每种变体;例如,我计算了行、行、行、行、行等。我已经单独测试了正则表达式公式,它们工作正常。但是,当我将所有这些组合到上面的代码中时,我收到以下错误消息:

Error Message Screenshot

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

最佳答案

这种情况下的主要错误是由于您使用的是所有格量词而不是常规的非所有格量词。

当用户在在线 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\.*\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

请参阅regex demo在 Regex101 中,请注意 Python在左侧选择的选项。

另外,请注意,可以通过添加 (?i) 使整个模式不区分大小写。在模式的开头,或者通过使用 re.I 编译正则表达式或re.IGNORECASE论据。这将“同时考虑同一单词的变体(小写、大写和标题大小写)”。

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

关于python - 使用长正则表达式公式进行自由文本解析导致错误 : multiple repeat in python? 包含屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58734438/

相关文章:

javascript - JSLint - 在 '\' 之前出现意外的 '.'

Python 如何将带连字符的单词与换行符合并?

c# - 正则表达式替换和划分

python - 将不同长度的列添加到 Pandas 数据框中

python - Pandas 如何在数据框列中提取整数和 float 的混合

python - 如何为任意函数定义 chi2 值函数?

python - Airflow - 使用 COPY 导出 PostgreSQL 表

python - 如何改变pygal中的描边颜色?

python - 从 peewee 模型中获取有序的字段名称

python - Pandas :解析结构化非表格文本中的值