regex - 带有正则表达式的解析器用于查找单词、过滤问题
问题描述
我有一个需要解析的字符串,我几乎得到了它,但是一个元素总是被排除在外。我用 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]
所以大写字母的块被排除在外。
解决方案
这[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']
匹配 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 次(因此是可选的)。
推荐阅读
- ios - 如何从 Geo JSON 文件中找到纬度和经度?
- hugo - .md 文件的 go 模板变量是什么?
- redux - Redux 可以 reducer 接受多个动作
- java - 如何转换单声道
- > 流式传输
? - c++ - 如何找到此交换函数(单链表)中的错误?
- python-3.x - 在机器学习中,编码非层次分类特征的最佳方法是什么?
- android - 无法将图像从 android 应用程序上传到球衣服务器
- webpack - 如何使用 webpack 忽略或替换一些没有真正使用的模块?
- python - 如何使用 pandas 将字符串与数据框中的字符串进行比较?
- java - 如何修复“错误:';' 预期”或“错误:')' 预期”和布尔值中的错误