首页 > 解决方案 > 使用 findall 在字符串中找不到三个连续的单词

问题描述

我试图使用 findall() 方法在给定文本中查找名称。当我使用 search() 方法时,我的名字出现在文本中,但 findall 根本不起作用。

给定的文本是:

我试图用粗体字找到那些名字

R120221325      ARYAN BAJAJ YASHWARDHAN                MANISHA 716012335X SMDS Grd Crd IN TH [IN+TH] TW PR OR Tot% Crd Grd Pts Pts ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~ SEM.:1 406261 021/030 043/070 064/100 ------- ------- ------- 64 04 A 08 32 406261 ------- ----- -- ------- ------- 040/050 ------- 80 01 O 10 10 406262 018/030 046/070 064/100 ------- -- ----- ------- 64 03 A 08 24 406262 ------- ------- ------- -------- ---- --- 040/050 80 01 O 10 10 406263 019/030 055/070 074/100 ------- ------- ------- 74 03 A+ 09 27 406263 -- ----- ------- ------- 042/050 ------- ------- 84 01 O 10 10 406264D 024/030 043/070 067/ 100 ------- ------- ------- 67 03 A 08 24 406264D ------- ------- ------- - ------ ------- 040/050 80 01 O 10 10 406265D 016/030 050/070 066/100 ------- ------- ----- -- 66 03 A 08 24 406266 ------- ------- ------- 045/050------- ------- 90 02 O 10 20 410249C ------- ------- ------- PP ------- - ------ PP 00 P 00 00 SEM.:2 406268 * 020/030 034/070 054/100 ------- ------- ------- 54 03 B 06 18 406268 * ------- --- ---- ------- ------- ------- 044/050 88 01 O 10 10 406269 * 023/030 047/070 070/100 ------ - -------- ------- 70 03 A+ 09 27 406269 * ------- ------- ------- ------- ------- 043/050 86 01 O 10 10 406270C * 024/030 053/070 077/100 ------- ------- ------- 77 03 A+ 09 27 406270C * -------- ------- ------- ------- ------- 040/050 80 01 O 10 10 406271B * 024 /030 045/070 069/100 ------- ------- ------- 69 03 A 08 24 406273 * ------- ------- ------- 092/100 ------- ------- 92 04 O 10 40 406273 * ------- ------- ----- -- ------- ------- 047/050 94 02 O 10 20 406274 * ------- ------- ------- 042/050------- ------- 84 01 O 10 10 第四年 SGPA:8.8,获得的总学分:44 B150084606       DHAIRYA YASHRAJ 萨伦克              HEENA 716012335X SMDS Grd Crd IN TH [IN+TH] TW PR OR Tot% Crd Grd Pts Pts ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~ ~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~ ~~ SEM.:1 406261 019/030 046/070 065/100 ------- ------- ------- 65 04 A 08 32 406261 ------- ----- -- ------- ------- 041/050 ------- 82 01 O 10 10 406262 022/030 047/070 069/100 ------- -- ----- ------- 69 03 A 08 24 406262 ------- ------- ------- ------- ---- --- 043/050 86 01 O 10 10 406263 021/030 050/070 071/100 ------- ------- ------- 71 03 A+ 09 27 406263 -- ----- ------- ------- 045/050 ------- ------- 90 01 O 10 10 406264D * 025/030 040/070 065 /100 ------- ------- ------- 65 03 A 08 24 406264D ------- ------- ------- ------- ------- 045/050 90 01 O 10 10 406265D 024/030 044/070 068/100 ------- ------- ---- --- 68 03 A 08 24 406266 ------- ------- ------- 043/050------- ------- 86 02 O 10 20 410249C ------- ------- ------- PP ------- - ------ PP 00 P 00 00 SEM.:2 406268 * 012/030 038/070 050/100 ------- ------- ------- 50 03 B 06 18 406268 * ------- --- ---- ------- ------- -------- 041/050 82 01 O 10 10 406269 * 021/030 045/070 066/100 ------ - -------- ------- 66 03 A 08 24 406269 * ------- ------- ------- ------- ------- 045/050 90 01 O 10 10 406270C * 020/030 046/070 066/100 ------- ------- ------- 66 03 A 08 24 406270C * ------- ------- ------- ------- ------- 040/050 80 01 O 10 10 406271B * 020 /030 044/070 064/100 ------- ------- ------- 64 03 A 08 24 406273 * ------- ------- ------- 096/100 ------- ------- 96 04 O 10 40 406273 * ------- ------- ----- -- ------- ------- 047/050 94 02 O 10 20 406274 * ------- ------- ------- 042/050------- ------- 84 01 O 10 10 第四年 SGPA:8.66,获得的总学分:44

我写的正则表达式是:

re.compile(r'\s{1,}\w*\s{1,}?\w*\s{1,}?\w*\s{1,}').findall()

用 findall 我得到空字符串列表

我在这里尝试做的是在由最小空格分隔的文本中找到三个连续的名称。因为整个文本中只有两个这样的名称,但我没有得到想要的输出,而是得到了充满空值的列表。但搜索给了我正确的输出,但我想要两个匹配,搜索只返回它找到的第一个匹配。

在将整个文本减少到最低限度然后包括两个 8 位数字后跟一个字符之间的值(如这里 R120221325、716012335X)之后,我能够得到这个

但如果我能在不将文本减少到最少的情况下得到答案,那将节省很多麻烦。

抱歉这么长的问题,但我找不到我尝试了这么久的答案。

任何帮助表示赞赏。

标签: pythonregex

解决方案


您可以利用间距数量的差异。

这些值在第一个捕获组中。

\b[A-Z]\d{9}\s+((?:\w+\s)+\w+)(?:\s{2,}\w+)+\s+\d{9}[A-Z]\b

解释

  • \b字边界
  • [A-Z]\d{9}\s+匹配 AZ,9 位数字(而不是 8 位数字)
  • (捕获组 1
    • (?:\w+\s)+\w+重复 1+ 次匹配 1+ 单词字符和单个空格字符,后跟 1+ 单词字符
  • )关闭组 1
  • (?:\s{2,}\w+)+重复 1+ 次匹配 2 个或更多空白字符和 1+ 个单词字符
  • \s+\d{9}[A-Z]匹配 1+ 个空格字符,后跟 9 个数字和一个字符 AZ
  • \b字边界

正则表达式演示| Python 演示


推荐阅读