【问题标题】:Regex: First word of sentence (following another sentence w/ unknown punctuation)正则表达式:句子的第一个单词(在另一个带有未知标点符号的句子之后)
【发布时间】:2015-06-19 00:22:43
【问题描述】:

我需要正则表达式,它可以在所有这些句子和任何类似的迭代中找到单词 when

  • “就是这个。”什么时候发生的? (以引号结尾/或 FN 调用)
  • 就是这样。什么时候发生的? (注意引号不见了)
  • 就是这样。什么时候发生的? (注意双空格)
  • 就是这样。什么时候发生的? (注意小写的 w)
  • 这是那个?什么时候发生的? (注意问号)

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

我最困惑的是,我的测试程序似乎不允许我在回溯文本中使用量词或其他修饰符。例如,我可以这样做:

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

我对该文本的问题是:

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

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

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

【问题讨论】:

  • @CasimiretHippolyte 不允许这样做!
  • 可选报价怎么样?
  • 确实,我还没有看到它被包含在lookbehind中!

标签: python regex testing match quantifiers


【解决方案1】:

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

(?:[.!)?])\"?\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']

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      仅仅因为你可以编写复杂、不灵活的正则表达式并不意味着你必须;-)

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

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

      我相信报价的事情也可以修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-23
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        • 2011-05-25
        相关资源
        最近更新 更多