想在Python中使用正则表达式来分组单词,就像字符类和重复量词分组字符一样吗
我试图用python解决一个问题,使用re。如果需要扩展功能,我可以使用regex,但我的需求似乎很简单 例如,我有以下文本:想在Python中使用正则表达式来分组单词,就像字符类和重复量词分组字符一样吗,python,regex,text-processing,Python,Regex,Text Processing,我试图用python解决一个问题,使用re。如果需要扩展功能,我可以使用regex,但我的需求似乎很简单 例如,我有以下文本: one one two one two three one two three four one two three four five 我希望返回包含1、2或3个单词的行,绕过其余的,因此在上面的示例文本中,前3行将匹配,其他行将不匹配 文本是由tesseract ocr实用程序生成的,因此文本可以是任何内容,包括乱码错误和所有内容,因此我在字符类中查找使用\S的
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]+?[ ]?$
问题是,我正处于开发的原型阶段,我想我需要扩展它,以接受多达六个单词,同时,跳过只有一个单词的行
regex可以很容易地扩展来实现这一点,但我几乎可以肯定,我最终将需要一个regex来捕获一行中最多三行符合我的单行标准的代码
所以,多亏了,我正在学习更多关于正则表达式的知识,并了解字符类--[]和重复量词--{}是如何工作的
我想要的是一种使用字符类和重复量词来分组单词而不是字符的方法。
我知道我可以用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]+?[\S]+?[\S]+?$
模式,有几件事你应该知道:1)它不匹配1个或2个字符的“单词”,因为\S+
和[\S]+?
这里每个字符都至少需要一个非空白字符,2)你不应该(超过ab)使用字符类,[\S]
=\S
,但是[\b]
!=<代码>\b和[.]
!=<代码>。仅在必要时使用字符类,以避免弄乱模式
你可以用
^\S+(?:\S+{0,2}$#一到三个“单词”字符串,单词之间只有规则的空格
^\S+(?:\S\S+{0,2}$#一到三个“单词”字符串,单词之间仅带空格
^\S+(?:\S+\S+{0,2}$#一到三个“单词”字符串,单词之间仅包含一个或多个空格字符
^\s*\s+(?:\s+\s+{0,2}\s*$#一到三个“word”字符串,字符串之间有一个或多个空格字符
#字符串中的单词和允许前导/尾随空格
注意:\S+
匹配任何1+非空白字符,它可以匹配abc
、abc123、
、--++==
等。如果您想匹配单词(字母、数字、
),可以使用\w+
。如果只想匹配字母单词,请使用[^\W\d\]+
详细信息
-字符串的开头^
-零个或多个空格字符\s*
-一个或多个非空白字符\S+
-零到两次出现一个或多个空白字符,然后出现一个或多个非空白字符(?:\s+\s+{0,2}
-零个或多个空格字符\s*
-字符串结束$
^\S+(?:\S+{0,2}$
,您可以通过将2
更改为n-1
倍值来进一步自定义它。Wiktor,我相信您已经得到了它。当我在pythex.org上试用它时,你的答案给出的结果与我在代码中使用它时略有不同,但这是另一天的问题。如果你把这个贴出来作为答案,我会接受的。你能把代码贴出来,解释一下什么不起作用吗?我想这会增加这个问题的价值。谢谢Wiktor,我知道我最初的正则表达式不是很有用。我使用[\S+]进行单词捕获,因为我在tesseract OCR输出中看到了由于粗略扫描而产生的噪音,我想至少确保我捕获了所有内容以进行评估,目的是重新扫描有噪音的页面,或者在噪音足够低的情况下手动编辑结果。@user1945982在字符串中,在one-two
之后,有一个空间。您需要一个^\s*\s+(?:\s+\s+{0,2}\s*$
或^*\s+(?:\s+\s+{0,2}*$
来匹配前导/尾随空格。投票结果非常有用。在我的测试字符串中添加空格使输出与pythex示例匹配。但是,您的两个候补者在一个匹配中使用了第一行和第二行:测试结果:['one\none two','one-two']。我将继续介绍您的示例,并让它们处理我的OCR输出。再次感谢Wiktor@user1945982如果您需要确保匹配不能跨行,只需使用第一个正则表达式和一个规则空格,^*\S+(?:\S+){0,2}*$
,或^[^\S\r\n]*\S+(?:[^\S\r\n]\S+{0,2}[^\S\r\n]*$
。这是因为\s
匹配任何类型的空格,甚至是换行符。感谢Wiktor--我意识到\s是跨行的,并更正了它。我使用这个正则表达式的最终目标是允许它跨越有限数量的行,就像它跨越有限数量的单词一样,对于以后希望正则表达式捕获1-3个这样的行组的人来说,这对我来说是有效的:(?:^[\s]*\s+(?:+\s+{0,2}[\s]*\n){1,3}