簡體   English   中英

使用長正則表達式公式解析自由文本導致錯誤:python 中的多次重復? 包括截圖

[英]Free text parsing using long regex formula leading to error: multiple repeat in python? Screenshot included

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

編輯:我逃脫了“。” 在正則表達式公式中,但我仍然遇到同樣的錯誤。

為此,我使用 pandas 將 .xslx 文件轉換為 pandas dataframe:

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 的提取 function 使用正則表達式模式提取我的字符串字段 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)   

我需要解析的字符串字段可以通過多種方式輸入,並且我在正則表達式公式中考慮了每種方式以及單詞的每個變體; 例如,我計算了線、線、線、線、線等。我已經單獨和單獨測試了正則表達式公式,它們工作正常。 但是,當我在上面的代碼中組合所有這些時,我收到以下錯誤消息:

錯誤消息截圖

你能幫我解決這個問題嗎?

此外,是否有另一種方法可以同時解釋同一個單詞的變體(小寫、大寫和標題大小寫)?

謝謝!

這種情況下的主要錯誤是由於您使用的是所有格量詞而不是常規的非所有格量詞。

當用戶在在線 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

請參閱 Regex101 上的正則表達式演示,注意左側選擇的Python選項。

另外,請注意,可以通過在模式的開頭添加(?i)或使用re.Ire.IGNORECASE arguments 編譯正則表達式來使整個模式不區分大小寫。 這將“同時考慮同一單詞的變體(小寫、大寫和標題大小寫)”。

注意:如果你真的想使用所有格量詞,你可以在正向前瞻和反向引用的幫助下模擬所有格量詞 但是,在 Python 中,您需要re.finditer才能訪問整個匹配值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM