【问题标题】:Need to fix regex statement to get correct information from excel file names需要修复正则表达式以从 excel 文件名中获取正确的信息
【发布时间】:2021-03-02 09:13:18
【问题描述】:

我有一个名称格式类似的 excel 文件列表。我需要将他们名称中的信息用作熊猫数据框中的列。我对正则表达式不太熟悉,但我使用谷歌和堆栈溢出来弄清楚如何做我需要的。但是,我需要帮助解决一些极端情况。

这是我拥有的前 40 个文件的名称列表,它可以帮助展示我面临的挑战:

Maker Month Wise Data  of VADAKARA RTO - KL18 , Kerala (2020).xlsx
Maker Month Wise Data  of KATHUA RTO - JK8 , Jammu & Kashmir (2020).xlsx
Maker Month Wise Data  of KANCHEEPURAM RTO - TN21 , Tamil Nadu (2020).xlsx
Maker Month Wise Data  of KANJIRAPPALLY SRTO - KL34 , Kerala (2020).xlsx
Maker Month Wise Data  of PATHANKOT SDM - PB35 , Punjab (2020).xlsx
Maker Month Wise Data  of Chiplun Chiplun Track - MH202 , Maharashtra (2020).xlsx
Maker Month Wise Data  of ZUNHEBOTO DTO - NL6 , Nagaland (2020).xlsx
Maker Month Wise Data  of MAJITHA SDM - PB81 , Punjab (2020).xlsx
Maker Month Wise Data  of Adinath Fitness Center - RJ260 , Rajasthan (2020).xlsx
Maker Month Wise Data  of MUMBAI (EAST) - MH3 , Maharashtra (2020).xlsx
Maker Month Wise Data  of CHIDAMBARAM RTO - TN544 , Tamil Nadu (2020).xlsx
Maker Month Wise Data  of PUDUCHERRY - PY1 , Puducherry (2020).xlsx
Maker Month Wise Data  of RANIPET RTO - TN73 , Tamil Nadu (2020).xlsx
Maker Month Wise Data  of RTA, HISAR - HR39 , Haryana (2020).xlsx
Maker Month Wise Data  of AIZAWL RURAL DTO - MZ9 , Mizoram (2020).xlsx
Maker Month Wise Data  of ANANDPUR SAHIB SDM - PB16 , Punjab (2020).xlsx
Maker Month Wise Data  of PEN (RAIGAD) - MH6 , Maharashtra (2020).xlsx
Maker Month Wise Data  of PEHOWA - HR41 , Haryana (2020).xlsx
Maker Month Wise Data  of AKOLA - MH30 , Maharashtra (2020).xlsx
Maker Month Wise Data  of CANACONA RTO - GA10 , Goa (2020).xlsx
Maker Month Wise Data  of Hooghly RTO - WB15 , West Bengal (2020).xlsx
Maker Month Wise Data  of DEVIKULAM SRTO - KL68 , Kerala (2020).xlsx
Maker Month Wise Data  of KUTTANADU SRTO - KL66 , Kerala (2020).xlsx
Maker Month Wise Data  of CHENNAI (NORTH-EAST) RTO - TN3 , Tamil Nadu (2020).xlsx
Maker Month Wise Data  of RLA SHILLAI - HP85 , Himachal Pradesh (2020).xlsx
Maker Month Wise Data  of Baloda Bazar DTO - CG22 , Chhattisgarh (2020).xlsx
Maker Month Wise Data  of TC OFFICE - STA OFFICE - KL99 , Kerala (2020).xlsx
Maker Month Wise Data  of NANDURBAR - MH39 , Maharashtra (2020).xlsx
Maker Month Wise Data  of KHETRI DTO - RJ53 , Rajasthan (2020).xlsx
Maker Month Wise Data  of AHMEDGARH SDM - PB82 , Punjab (2020).xlsx
Maker Month Wise Data  of Alipurduar RTO - WB69 , West Bengal (2020).xlsx
Maker Month Wise Data  of RLA GOHAR - HP32 , Himachal Pradesh (2020).xlsx
Maker Month Wise Data  of KOLHAPUR - MH9 , Maharashtra (2020).xlsx
Maker Month Wise Data  of SILVASSA - DD1 , UT of DNH and DD (2020).xlsx
Maker Month Wise Data  of MANNARGHAT SRTO - KL50 , Kerala (2020).xlsx
Maker Month Wise Data  of SRIVILLIPUTHUR RTO - TN605 , Tamil Nadu (2020).xlsx
Maker Month Wise Data  of ZONAL OFFICE, SOUTH WEST DELHI,DWARKA - DL9 , Delhi (2020).xlsx
Maker Month Wise Data  of BUDGAM ARTO - JK4 , Jammu & Kashmir (2020).xlsx
Maker Month Wise Data  of Kolar  RTO - KA7 , Karnataka (2020).xlsx
Maker Month Wise Data  of Singtam, East Sikkim - SK8 , Sikkim (2020).xlsx

这是使用正则表达式从这些文件名中提取信息的代码的 sn-p:

# Add RTO column - WORKS
rto = re.search('\s\sof\s(.*)\s\-', file_name)
df['RTO'] = rto.group(1)

# Add registration number column - NEEDS TO BE CORRECTED - See match 27
registration_number = re.search('\s\-(.*)\s\,', file_name)
df['Registration Number'] = registration_number.group(1)

# Add state column - NEEDS TO BE CORRECTED - See match 14, 34, 37
state = re.search('\,\s(.*)\s\(', file_name)
df['State'] = state.group(1)

# Add year column - NEEDS TO BE CORRECTED - See match 10, 17, 24, 
year = re.search('\((.*)\)', file_name)
df['Year'] = year.group(1)

RTO 的正则表达式似乎可以正常工作,但是对于注册号、州和年份,需要修复某些极端情况。我在代码 cmets 中突出显示了正则表达式错误行。如果我可以提供任何其他意见,请告诉我。

如果我能在解决此问题时获得任何帮助,我将不胜感激!

【问题讨论】:

  • 为什么不使用previous 单提取正则表达式?看来您只需要第 1 组模式中的贪婪量词,\s+of\s(.*),\s*(.*?)\s*\((\d{4})\),检查this regex demo
  • 嘿,本质上我也必须将注册号字段分开,这意味着我必须有另一列输入像“AR15”或“MH39”这样的输入,我不能让它们分组RTO 字段,我不想在我结束问题后再次打扰你。你能帮我解决这个问题吗?

标签: regex


【解决方案1】:

我认为你可以修改你以前的解决方案

pattern = r'\s+of\s+(.*?)\s+-\s+(.*?)\s+,\s+(.*?)\s+\((\d{4})\)'
df[['RTO', 'Registration Number', 'State','Year']] = df['Maker'].str.extract(pattern, expand=True)

请参阅regex demo

如果注册号只能包含大写字母和数字,您可以将(.*?)替换为([A-Z0-9]+)并使用\s+of\s+(.*?)\s+-\s+([A-Z0-9]*)\s+,\s+(.*?)\s+\((\d{4})\)

详情

  • \s+ - 一个或多个空格
  • of - 一句话of
  • \s+ 一个或多个空格
  • (.*?) - 第 1 组:除换行符之外的任何零个或多个字符尽可能少
  • \s+,\s+ - 用 1+ 个空格括起来的逗号
  • (.*?) - 第 2 组:除换行符之外的任何零个或多个字符尽可能少
  • \s+,\s+ - 用 1+ 个空格括起来的逗号
  • (.*?) - 第 3 组:除换行符之外的任何零个或多个字符尽可能少(或者,如果使用 [A-Z0-9]+,则任何一个或多个大写 ASCII 字母或数字)
  • \s+ - 1+ 个空格
  • \( - 一个 ( 字符
  • (\d{4}) - 第 3 组:四位数
  • \) - ) 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2012-07-16
    相关资源
    最近更新 更多