【问题标题】:Match any dot that doesn't have a certain word before [duplicate]匹配任何在[重复]之前没有特定单词的点
【发布时间】:2020-06-26 07:20:51
【问题描述】:

我有一个字符串,其模式类似于以下:

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.

我想用“.”分割这个字符串以获得类似:['TITLE','wordX. aaa.: AAAAAAA;AAAAA', 'BBBB: bbbb']

问题是字符串 'wordX. aaa.: AAAAAAA;AAAAA' 本身包含一个点,所以通过我之前所说的拆分字符串,真正的输出将是:['TITLE','wordX','aaa.: AAAAAAA;AAAAA', 'BBBB: bbbb']

因此,我想要一个正则表达式,它可以让我告诉拆分找到“每个不跟随 wordX 的点”。在互联网上寻找这个,我发现有些人建议对这些情况使用负前瞻,比如^((?!wordX).)*$。尽管如此,这显然对我不起作用(也许我没有以正确的方式使用它)。

由于这一切,我想知道如何构建一个正则表达式来匹配前面没有 wordX 并且后面跟着空格的每个点。

【问题讨论】:

  • 您问题的第一部分和第二部分似乎不对应。你想只在一个点后面跟着一个短语,还是只在它后面没有某个短语时才找到它?如果是前者,一个简单的正向前瞻就足够了,例如\.(?=wordX).
  • 如果你在匹配的点上分割字符串,你会不会得到["TITLE.wordX", " aaa", ": AAAAAAA;AAAAA", " BBBB: bbbb"]
  • @CarySwoveland 问题可能不清楚,但我用“点+空格”分割
  • @oriberu 我想做第二件事,找到前面没有wordX的点
  • 您的最后一条评论与您问题的最后一句直接矛盾,并且该句子没有说明点后跟空格的必要性。请编辑。

标签: python regex


【解决方案1】:

我仍然不完全清楚您到底想要哪种方案,所以这里有几个选项,每种情况都匹配。

正向预测:

\.(?=wordX)

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
     ^

负前瞻:

\.(?!wordX)

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
           ^    ^               ^           ^

正向回顾:

(?<=wordX)\.

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
           ^

消极的后视:

(?<!wordX)\.

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.
     ^          ^               ^           ^

无论如何,您都应该改写您的问题。干杯。

【讨论】:

  • 感谢您的回答。我确实改写了我的问题。我想要的替代方案是您谈论的最后一个,但是,在regextester.com 尝试它时,它似乎也在 wordX 之后标记了点
  • 哦,对不起,我在另一个网站上试过了,它确实有效(问题是我谈到的第一页是针对 javascript 的)。谢谢!
  • 是的,JavaScript 和lookbehinds 的历史相当悠久。但它在 2018 年标准中,我们可以希望得到广泛实施。 :)
【解决方案2】:

也许……

^(.*?)\.((.*?)(?<!wordX)\.(.*?))\. (.*)\.

给定:

TITLE.wordX. aaa.: AAAAAAA;AAAAA. BBBB: bbbb.

与组:

\1 \2 \5

演示:https://regex101.com/r/hPY8JX/2

糟糕,要更新 JS 吗?

^(.*?)\.(wordX\..*)\. (.*)\.

https://regex101.com/r/V49Fiw/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2018-01-02
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多