首页 > 解决方案 > 带有正则表达式的解析器用于查找单词、过滤问题

问题描述

我有一个需要解析的字符串,我几乎得到了它,但是一个元素总是被排除在外。我用 python 和 re 库构建解析器。

我已经用这个正则表达式试过了:

([A-Z][a-z]+ [[A-Z][a-z]+)|([A-Z][a-z]+)|([A-Z]*^\2)

当我删除最后一组正则表达式时,没有任何机会。

我想解析例如这样的字符串:

Two WordsThisElseITForTwo Buildings

输出应该是:

[Two Words, This, Else, IT, For, Two Buildings]

但目前的输出是:

[Two Words, This, Else, For, Two Buildings]

所以大写字母的块被排除在外。

标签: regexpython-3.x

解决方案


[A-Z]*^\2是一个不匹配任何字符串的模式,因为^匹配字符串的起始位置并且它不能出现在字符串中。

您可以使用

import re
text = "Two WordsThisElseITForTwo Buildings"
print( list(filter(None, re.split(r'([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)', text))) ) 
# or
# print( [x for x in re.split(r'([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)', text) if x] )
# => ['Two Words', 'This', 'Else', 'IT', 'For', 'Two Buildings']

查看在线 Python 3 演示

匹配 1 个或 2 个空格分隔的单词,这些 ([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)单词以大写字母开头,然后有 1+ 个小写字母,并且在匹配的文本之间也输出不匹配的内容,因为整个模式都包含在一个捕获组中。空项目被过滤掉。

更多图案细节

  • (- 捕获组 #1 的开始:
  • [A-Z]- 一个大写的 ASCII 字母
  • [a-z]+ - 1+ 小写 ASCII 字母
  • (?: - 非捕获组的开始:
    • \s+- 1+ 空格
    • [A-Z]- 一个大写的 ASCII 字母
    • [a-z]+ - 1+ 小写 ASCII 字母
  • )?- 非捕获组结束,重复 1 或 0 次(因此是可选的)。

推荐阅读