正则表达式:句子的第一个词(在另一个带有未知标点符号的句子之后)
Regex: First word of sentence (following another sentence w/ unknown punctuation)
我需要能够在所有这些句子和任何类似的迭代中找到单词 when 的正则表达式。
- "This is that." 什么时候发生的? (结束于 quotes/or FN 调用)
- 就是这样。什么时候发生的? (注意引号不见了)
- 就是这样。什么时候发生的? (注意双 space)
- 就是这样。什么时候发生的? (注意小写的 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
结果。所以他们不是问题。顺便说一句,它们会成为问题吗?
由于 re 模块不支持可变长度回溯,您可以捕获所需的字符串。
(?:[.!)?])\"?\s{1,2}([a-zA-Z]+)(?=\s)
>>> 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']
由于 re 模块不允许可变长度后视,您可以构建固定长度的后视交替:
p = re.compile(r'(?:(?<=[.?!"]\s\s)|(?<=[.?!"]\s))[a-z]+', re.IGNORECASE)
仅仅因为您可以编写复杂、不灵活的 RegEx 并不意味着您必须这样做 ;-)
使用 \w
匹配单词字符,使用 \s*
匹配任意数量的空格。
除了还要匹配 "opening" 双引号后的第一个单词外,这应该可以帮助您入门:(?:[.!?"]\s*)(\w+)
我确定引用的问题也可以修复。
我需要能够在所有这些句子和任何类似的迭代中找到单词 when 的正则表达式。
- "This is that." 什么时候发生的? (结束于 quotes/or FN 调用)
- 就是这样。什么时候发生的? (注意引号不见了)
- 就是这样。什么时候发生的? (注意双 space)
- 就是这样。什么时候发生的? (注意小写的 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
结果。所以他们不是问题。顺便说一句,它们会成为问题吗?
由于 re 模块不支持可变长度回溯,您可以捕获所需的字符串。
(?:[.!)?])\"?\s{1,2}([a-zA-Z]+)(?=\s)
>>> 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']
由于 re 模块不允许可变长度后视,您可以构建固定长度的后视交替:
p = re.compile(r'(?:(?<=[.?!"]\s\s)|(?<=[.?!"]\s))[a-z]+', re.IGNORECASE)
仅仅因为您可以编写复杂、不灵活的 RegEx 并不意味着您必须这样做 ;-)
使用 \w
匹配单词字符,使用 \s*
匹配任意数量的空格。
除了还要匹配 "opening" 双引号后的第一个单词外,这应该可以帮助您入门:(?:[.!?"]\s*)(\w+)
我确定引用的问题也可以修复。