【问题标题】:Trying to find the regex for this particular case? Also can I parse this without creating groups?试图找到这种特殊情况的正则表达式?我也可以在不创建组的情况下解析它吗?
【发布时间】:2019-11-19 04:56:35
【问题描述】:

要捕获的文本如下所示..

  Policy Number    ABCD000012345    other text follows in same line....

我的正则表达式看起来像这样

 regex value='(?i)(?:[P|p]olicy\s[N|n]o[|:|;|,][\n\r\s\t]*[\na-z\sA-Z:,;\r\d\t]*[S|s]e\s*[H|h]abla\s*[^\n]*[\n\s\r\t]*|(?i)[P|p]olicy[\s\n\t\r]*[N|n]umber[\s\n\r\t]*)(?P<policy_number>[^\n]*)'

这种特殊情况与第二个或情况相匹配。但是它也捕获了策略编号之后的所有内容。它只是抓住数字的停止条件是什么。我知道有些不对劲,但找不到出路。

 (?i)[P|p]olicy[\s\n\t\r]*[N|n]umber[\s\n\r\t]*)

电流输出

    ABCD000012345othertextfollowsinsameline....

预期输出

   ABCD000012345

【问题讨论】:

  • 前面总是有两个词?要检索的 ID 的预期结构是什么,是否有任何特定格式?
  • id 可以是字母和数字的混合,也可以是或。这是唯一的条件,只要它抓住两个空格之间的内容
  • 1.之前有固定数量的单词吗? ID是字母然后是各种数字的混合吗?您能否提供更多输入示例以进行验证?
  • [P|p] 匹配 P|p。添加(?i) 使其匹配任何大小写,因此不需要[Pp]。您的正则表达式过于复杂。也许只是匹配^.*?(?: {4}|\t)(\S+) - 结果在第一组?很难说,因为你实际上并没有给我们任何要遵守的规则(正则表达式实际上只是规则 - 所以没有任何规则会让你很难猜测你的情况)
  • 实际上你是对的。会摆脱它。对于我现在正在处理的内容,所有文本都应该看起来像这样。我唯一的目标是抓住第一个空间和第二个空间之间的所有内容,其中 id 实际是。 id 可以是任何格式的字符串,我仍然需要捕获它。我没有尝试验证 id,因为我直接存储数据库中捕获的任何内容。

标签: python regex


【解决方案1】:

您可以使用更简单的正则表达式,只需从开头找到"[P|p]olicy\s*[N|n]umber\s*\b([A-Z]{4}\d+)\b.*" 并使用单词边界\b

pattern = re.compile(r"[P|p]olicy\s*[N|n]umber\s*\b([A-Z0-9]+)\b.*")
line = "Policy Number    ABCD000012345    other text follows in same line...."
matches = pattern.match(line)
id_res = matches.group(1)
print(id_res)  # ABCD000012345

如果总是有 2 个字才能使用 (?:\w+\s+){2}\b([A-Z0-9]+)\b.*


另外\s[\r\n\t\f\v ],所以不需要重复,你的[\n\r\s\t] 只是\s

【讨论】:

    【解决方案2】:

    您不需要指定大小写 pn,因为您已经指定不区分大小写。

    另外\s 已经涵盖了\n\t\r

    (?i)policy\s+number\s+([A-Z]{4}\d+)\b
    

    用于验证目的:Regex

    另一种解决方案:

    ^[\s\w]+\b([A-Z]{4}\d+)\b
    

    用于验证目的:Regex

    我更喜欢这个,以防您的文本从保单编号发生变化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      相关资源
      最近更新 更多