Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中正则表达式的混乱行为_Python_Regex_String - Fatal编程技术网

Python中正则表达式的混乱行为

Python中正则表达式的混乱行为,python,regex,string,Python,Regex,String,我试图使用python中的re模块匹配特定模式。 我希望匹配完整的句子(更准确地说,它们是由空格和/或标点符号分隔的字母数字字符串序列) 例如 “这是一个普通的句子。” “这也是有效的” “这个也是” 我尝试过各种正则表达式的组合,但我无法正确地掌握模式的工作原理,每个表达式都给了我一个不同但无法解释的结果(我承认我是一个初学者,但仍然如此) 我试过: “((\w+)(\s?))*” 据我所知,这应该匹配一个或多个字母数字,后跟一个或没有空格字符,然后它应该匹配整个模式。这似乎不是它所做

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

例如

  • “这是一个普通的句子。”
  • “这也是有效的”
  • “这个也是”
我尝试过各种正则表达式的组合,但我无法正确地掌握模式的工作原理,每个表达式都给了我一个不同但无法解释的结果(我承认我是一个初学者,但仍然如此)


我试过:

  • “((\w+)(\s?))*”

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

  • “(\w+?)*”

    我甚至不知道这个应该怎么做。官方文档(python帮助('re'))说,+,?匹配前面RE的x或x(贪婪)重复。 在这种情况下,前面的RE仅仅是“?”的空格,还是“\w+”是前面的RE?“”运算符的RE是什么?我从中得到的输出是[‘句子’]

  • 其他,如“(\w+\s?+”;“((\w*)(\s???)等,基本上是同一想法的变体,即句子是一组字母数字,后跟单个/有限数量的空格,这种模式反复出现

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



最后,我终于得到了“[\w]+”来为我工作,但有了它,我无法限制延续中的空白字符数。

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

下面是一个正则表达式,它将与给出的示例相匹配:

([a-zA-Z0-9,\. ]+)

您关于正则表达式的推理是正确的,您的问题来自于使用带有
*
的捕获组。这里有一个替代方案:

>>> 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'

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

([a-zA-Z0-9\s])*
上面的正则表达式将匹配一个句子,其中它是一个系列或系列中的空格零次或多次。您可以将其细化为以下内容:

([a-zA-Z0-9])([a-zA-Z0-9\s])*
它简单地说,上面的序列必须以字母数字字符开头

希望这就是您想要的。

也许这会有帮助:

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 |+)
中使用交替来描述句尾条件。请注意,在第三个交替中使用了两个空格。第二个空格具有“+”元字符,因此一行中的两个或更多空格将成为句尾。

是否使用
re.findall()
?您是如何检索结果的?我假设您使用的是捕获组而不是整个匹配(
.group(0)
.group()
)?@JoelCornett是的,我使用的是re.findall()@oxc否,我现在使用的是findall()。我真的不知道.group()是如何检索的我可能在某个地方遗漏了这个细节,但你能告诉我句子边界是什么吗?是多个空格还是标点符号还是…?你如何知道单词边界和句子边界之间的区别?我希望将整个句子匹配为一个正则表达式而不是单词。所以正则表达式应该返回[“这是一个常规句子”]。它是有效的,如果它是有效的,我的推理似乎是正确的。但为什么这对findall不起作用?这让我更加困惑。如果我的推理是正确的,那么为什么同样的方法对findall不起作用/给出了非常不同的结果?是否存在一些基本的差异b/w查找和匹配?您是否查看了?以回答您的问题estion我基本上会引用您所询问的函数的文档。我浏览了RE手册页和docs.python.org上的在线HOWTO,但除了Match将正则表达式匹配到字符串的开头,findall查找所有不重叠的事件之外,我没有找到任何关于如何或为什么出现re实际匹配中的差异。@Ayos我错了,我可能太苛刻了。我会写一个解释。我使用“句子”这个词只是简单地给出了我正在使用的东西的大致概念。我在问题中指定了我所指的句子的确切含义。另外,我使用它的应用程序要求我检查wh的数量在这两个空格之间,如果不止一个,则需要采取不同的行动。这个答案似乎符合我目前的需要。但是你能告诉我正则表达式中的逻辑有什么问题吗?