2

我正在尝试使用 python 中的 re 模块匹配特定模式。我希望匹配一个完整的句子(更准确地说,它们是由空格和/或标点符号分隔的字母数字字符串序列)

例如。

  • “这是一句普通话。”
  • “这也是有效的”
  • “This ONE也是”

我尝试了各种正则表达式组合,但我无法正确掌握模式的工作原理,每个表达式都给了我不同但莫名其妙的结果(我承认我是初学者,但仍然如此)。


我试过了:

  • "((\w+)(\s?))*"

    据我所知,这应该匹配一个或多个字母数字,然后贪婪地跟随一个或没有空格字符,然后它应该贪婪地匹配整个模式。这不是它似乎做的,所以很明显我错了,但我想知道为什么。(我希望这会返回整个句子作为结果)对于上面提到的第一个示例字符串,我得到的结果是 [('sentence', 'sentence', ''), ('', '', ''), ('', '', ''), ('', '', '')]。

  • "(\w+ ?)*"

    我什至不确定这个应该如何工作。官方文档(python help('re')) 说,+,? 匹配前面 RE 的 x 或 x(贪婪)重复。在这种情况下,只需将前面的 RE 空格用于“?” 还是 '\w+ ' 是前面的 RE?' ' 运算符的 RE 是什么?我得到的输出是['sentence']。

  • 其他如 "(\w+\s?)+)" ;"((\w*)(\s??)) 等基本上是相同想法的变体,即句子是一组字母数字,后跟单个/有限数量的空格,并且这种模式重复超过。

有人能告诉我哪里出错了,为什么,为什么上面的表达式不能像我期望的那样工作?


PS 我最终得到了 "[ \w]+" 为我工作,但是这样我不能限制连续的空白字符的数量。

4

4 回答 4

4

您对正则表达式的推理是正确的,您的问题来自使用带有*. 这是一个替代方案:

>>> s="This is a regular sentence."
>>> import re
>>> re.findall(r'\w+\s?', s)
['This ', 'is ', 'a ', 'regular ', 'sentence']

\b在这种情况下,使用它来匹配单词边界可能更有意义。

>>> re.findall(r'\w+\b', s)
['This', 'is', 'a', 'regular', 'sentence']

或者,您可以通过匹配整个句子re.match并使用re.group(0)来获得整个匹配:

>>> r = r"((\w+)(\s?))*"
>>> s = "This is a regular sentence."
>>> import re
>>> m = re.match(r, s)
>>> m.group(0)
'This is a regular sentence'
于 2012-07-06T23:35:01.493 回答
3

这是一个很棒的正则表达式教程网站:

http://regexone.com/

这是一个与给出的示例匹配的正则表达式:

([a-zA-Z0-9,\. ]+)
于 2012-07-06T23:34:46.533 回答
0

也许这会有所帮助:

import re

source = """
This is a regular sentence.
this is also valid
so is This ONE
how about this one  followed by this one
"""

re_sentence = re.compile(r'[^ \n.].*?(\.|\n|  +)')

def main():
    i = 0
    for s in re_sentence.finditer(source):
        print "%d:%s" % (i, s.group(0))
        i += 1

if __name__ == '__main__':
    main()

我在表达式中使用交替(\.|\n| +)来描述句末条件。注意在第三个交替中使用了两个空格。第二个空格具有“+”元字符,因此一行中的两个或多个空格将成为句子的结尾。

于 2012-07-07T15:42:23.817 回答
0

为什么要限制连续空白字符的数量?因为一个句子可以在一行中有任意数量的单词(字母数字字符序列)和空格,而是一个句子是以标点符号结尾的文本区域,或者更确切地说是不在上述序列中的东西,包括空格。

([a-zA-Z0-9\s])*

上面的正则表达式将匹配一个句子,其中它是一个系列或系列中的空格零次或多次。您可以将其细化为以下内容:

([a-zA-Z0-9])([a-zA-Z0-9\s])*

这只是说明上述序列必须以字母数字字符开头。

希望这就是你要找的。

于 2012-07-06T23:39:35.060 回答