正则表达式:第一个单词的句子(跟着另一个句子/未知的标点符号)

时间:2015-04-13 15:46:30

标签: python regex testing match quantifiers

我需要正则表达式,在所有这些句子和任何类似的迭代中都会找到这个词。

  • “就是这样。”什么时候发生的? (以报价/或FN电话结束)
  • 就是这样。什么时候发生的? (注意引用已经消失)
  • 就是这样。什么时候发生的? (注意双重空间)
  • 就是这样。什么时候发生的? (注意小写w)
  • 这是那个?什么时候发生的? (注意问号)

此代码将在第一次迭代时匹配:(?<=\.\".)[a-zA-Z]*?(?=\s)

我很担心我的测试程序似乎不允许我在回顾文本中使用量词或其他修饰符。例如,我可以做类似的事情:

(?<=((\.)|(\!)|(\?))\"{0,1}\s{1,2})[a-zA-Z]*?(?=\s)

我对该文字的疑问是:

1)它似乎似乎没有处理。

2)似乎没有任何简单的方法可以使量化者在回顾中变得懒惰。换句话说,即使是处理,我也不确定它是如何理解(?<=((\.)|(\!)|(\?))\"{0,1}\s{1,2}?)[a-zA-Z]*?(?=\s)

3)我添加了过多的括号,因为我觉得它更容易阅读,但我没有得到结果w/w/o。所以他们不是问题。顺便说一句,他们会成为一个问题吗?

3 个答案:

答案 0 :(得分:0)

由于re模块不支持可变长度的lookbehind,你可以捕获你想要的字符串。

(?:[.!)?])\"?\s{1,2}([a-zA-Z]+)(?=\s)

DEMO

>>> s = '''"This is that." When did it happen? (ending in quotes/or FN call)
This is that. When did it happen? (note quotes are gone)
This is that.  When did it happen? (notice the double space)
This is that. when did it happen? (notice the lowercase w)
This is that? When did it happen? (notice the question mark)'''
>>> re.findall(r'(?:[.!)?])\"? {1,2}([a-zA-Z]+)(?=\s)', s)
['When', 'When', 'When', 'when', 'When']

答案 1 :(得分:0)

由于re模块不允许使用可变长度的lookbehind,您可以构建一个固定长度的lookbehinds替换:

p = re.compile(r'(?:(?<=[.?!"]\s\s)|(?<=[.?!"]\s))[a-z]+', re.IGNORECASE)

答案 2 :(得分:0)

仅仅因为你可以编写复杂,不灵活的RegExes并不意味着你必须; - )

使用\w匹配单词字符和\s*以匹配任意数量的空格。

除了匹配“打开”双引号之后的第一个单词之外,这应该可以帮助您入门:(?:[.!?"]\s*)(\w+)

我确定引用的东西也可以修复。