如何解决想用Python中的正则表达式对单词进行分组,就像字符类和重复量词对字符进行分组
我有一个问题,我想在 python 中使用 re。如果我需要扩展功能,我可以使用正则表达式,但我的需求似乎很简单。
例如我有以下文本:
one
one two
one two three
one two three four
one two three four five
我想找回包含 1、2 或 3 个单词的行,绕过其余的行,因此在上面的示例文本中,前 3 行将匹配,而其他行则不匹配。
文本是由 tesseract ocr 实用程序生成的,因此文本几乎可以是任何内容、乱码错误等等,所以我在这样的字符类中使用 \S 查找单词:[\S]+
我有以下有效的正则表达式:
^[\S]+[ ]?[\S]+?[ ]?[\S]+?[ ]?$
问题是,我处于开发的原型阶段,我猜我需要将其扩展为最多接受 6 个单词,同时跳过只有一个单词的行。
正则表达式可以很容易地扩展来做到这一点,但我几乎可以肯定,我最终需要一个正则表达式来连续捕获满足我的单行条件的三行。
所以,感谢 regular-expressions.info,我正在学习更多关于正则表达式的知识,并了解字符类 -- [] 和重复量词 -- {} 是如何工作的。
我想要的是一种使用字符类和重复量词来对单词而不是字符进行分组的方法。
我知道我可以在 python 中逐行完成这一切,但是当我在构建的工具中遇到更多 ocr 输出时,使用正则表达式将允许我扩展我的解决方案。
对如何进行有任何帮助吗?
---- 添加测试代码和 pythex.org 截图,详细说明不同的行为。
Wiktor 的正则表达式是 ^\S+(?: \S+){0,2}$
测试代码:
import re
def testre(pattern,text):
p = re.compile(pattern,re.M)
results = p.findall(text)
print(f'Test Results: {results}')
txt = 'one\none two\none two three\none two three four\none two three four five\n'
pattern1 = r'^\S+(?: \S+){0,2}$'
print(f'Test string...\n{txt}')
print(f'Test regex: {pattern1}')
testre(pattern1,txt)
运行时显示 Wiktor 的表达式按预期工作:
Test string...
one
one two
one two three
one two three four
one two three four five
Test regex: ^\S+(?: \S+){0,2}$
Test Results: ['one','one two','one two three']
但是,在 pythex.org 上运行它显示“一二”不匹配:
Wiktor 的正则表达式有效,但在 pythex.org 上看到的不同结果有点令人担忧。我希望使用 pythex 进行测试。
解决方法
关于 ^[\S]+[ ]?[\S]+?[ ]?[\S]+?[ ]?$
模式,您应该了解以下几点:1) 它不会匹配 1 个或 2 个字符的“单词”,因为 \S+
、[\S]+?
和 { {1}} 这里每个都需要至少一个非空白字符,2)你不应该(over|ab)使用字符类,[\S]+?
= [\S]
,但是 \S
!= { {1}} 和 [\b]
!= \b
。仅在必要时使用字符类,以免弄乱模式。
你可以使用
[.]
注意:.
匹配任意 1+ 个非空白字符,并且可以匹配 ^\S+(?: \S+){0,2}$ # One to three "word" string with a regular space between the words only
^\S+(?:\s\S+){0,2}$ # One to three "word" string with any whitespace between the words only
^\S+(?:\s+\S+){0,2}$ # One to three "word" string with one or more whitespace chars between the words only
^\s*\S+(?:\s+\S+){0,2}\s*$ # One to three "word" string with one or more whitespace chars between
# the words and allowing leading/trailing whitespace in the string
、\S+
、abc
等。如果要匹配单词(字母、数字、abc123,
),可以使用 ---++===
。如果您只想匹配字母词,请使用 _
。
详情
-
\w+
- 字符串的开始 -
[^\W\d_]+
- 零个或多个空白字符 -
^
- 一个或多个非空白字符 -
\s*
- 零到两次出现一个或多个任何空白字符,然后是一个或多个非空白字符 -
\S+
- 零个或多个空白字符 -
(?:\s+\S+){0,2}
- 字符串结束。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。