Python中正则表达式的混乱行为
我试图使用python中的re模块匹配特定模式。 我希望匹配完整的句子(更准确地说,它们是由空格和/或标点符号分隔的字母数字字符串序列) 例如Python中正则表达式的混乱行为,python,regex,string,Python,Regex,String,我试图使用python中的re模块匹配特定模式。 我希望匹配完整的句子(更准确地说,它们是由空格和/或标点符号分隔的字母数字字符串序列) 例如 “这是一个普通的句子。” “这也是有效的” “这个也是” 我尝试过各种正则表达式的组合,但我无法正确地掌握模式的工作原理,每个表达式都给了我一个不同但无法解释的结果(我承认我是一个初学者,但仍然如此) 我试过: “((\w+)(\s?))*” 据我所知,这应该匹配一个或多个字母数字,后跟一个或没有空格字符,然后它应该匹配整个模式。这似乎不是它所做
- “这是一个普通的句子。”
- “这也是有效的”
- “这个也是”
我试过:
- “((\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的数量在这两个空格之间,如果不止一个,则需要采取不同的行动。这个答案似乎符合我目前的需要。但是你能告诉我正则表达式中的逻辑有什么问题吗?