使用findall在字符串中找不到三个连续的单词

2024-06-11 17:21:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

给定的文本是:

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

R120221325ARYAN BAJAJ YASHWARDHANMANISHA 716012335X SMD Grd Crd在TH[IN+TH]TW PR或Tot%Crd Grd Pts~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~018/030046/070064/100---------------64 03 A 08 24 406262----------040/050 80 01 O 10 406263 019/030055/070 074/100----------74 03 A+09 27 406263----------042/050----------84 01 O 10406264D 024/030043/070067/100---------------67 03 A 08 24 406264D----------040/050 80 01 O 10 406265D 016/030050/070 066/100----------66 03 A 08 24 406266----------045/05010 20 410249C---------PP------PP 00 00 00 00 SEM.:2 406268*020/030 034/070 054/100----------54 03 B 06 18 406268*----PP------044/050 88 01 O 10 406269*023/030 047/070 070/100-----------------70 03 A+09 27 406269---------------043/050 86 01 O 10 406270C*024/030 053/070 077/100----------77 03 A+09 27 406270C----------040/050 80 01 O 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 B150084606DHAIRYA YASHRAJ SALUNKEHEENA 716012335X SMDS Grd Crd在第[IN+TH]天TW PR或Tot%Crd Grd Pts~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~022/030047/070069/100---------------69 03 A 08 24 406262----------043/050 86 01 O 10 406263 021/030050/070 071/100----------71 03 A+09 27 406263----------045/050-------90 01 O 10406264D*025/030040/07065/100---------------65 03 A 08 24 406264D----------045/050 90 01 O 10 10 406265D 024/030044/070 068/100----------68 03 A 08 24 406266----------043/050----------86 02 O1020410249C--------------PP---------PP 00 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 406269*021/030 045/070 066/100----------66 03 A 08 24 406269*-------——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————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()

在芬德尔的帮助下,我得到了一个空字符串列表

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

在将整个文本缩减到最小值,然后包含两个8位数字和一个字符之间的值(如这里的R120221325、716012335X)之后,我就能够得到这个结果

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

很抱歉问了这么长时间,但我找不到它的答案,我试了这么久

感谢您的帮助


Tags: 方法in文本名称pr名字ptspp
2条回答

这是因为\w*匹配任何个单词字符,包括0,因此您的regexp在三个连续的空格上匹配

将正则表达式更改为:

r'\b[A-Z]+\s+[A-Z]+\s+[A-Z]+\b'

+表示1次或多次出现,而不是零次或多次出现

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

这些值位于第一个捕获组中

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

解释

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

Regex demoPython demo

相关问题 更多 >