【问题标题】:Variable length lookahead/behind regex when you don't know exactly what you're matching (python)当您不确切知道要匹配的内容时,可变长度的前瞻/后置正则表达式(python)
【发布时间】:2021-07-13 21:40:13
【问题描述】:

不幸的是,我有一些转录本包含大量以句点分隔但没有空格的单词(即 word.word)。

有没有办法使用正则表达式来分隔它们,但只保留其他单词,如小数和缩写,如 U.K. 或 U.S.A?我打算对文本进行标记,因此我希望 word.word 的出现被计为单独的单词,但我不想弄乱缩写/小数/句点是单词一部分的任何其他地方。因为我想用空格替换这些特定的 word.word 句点,但不理会所有其他句点(或者至少不要用空格替换它们,因为那样会破坏缩写),我的第一个想法是这样的:

text = re.sub("(?<!\d){2,}\.(?!\d){2,}", " ", text)

查找由至少两个或多个非数字包围的句点,然后将句点替换为空格。但似乎可变长度的后视/前瞻并不是你能做的事情。我已经在一些正则表达式测试器中对此进行了测试,它仍然与上面的字母缩写匹配,尽管它不匹配小数。

是否有另一种方法来写下我的想法或另一种方法来解决这个问题?我已经在这个解决方案中陷入了某种困境,我找不到另一种方法可以接近我想要做的事情 - 甚至可以完成吗?

谢谢!

【问题讨论】:

  • 假设您只想按句点分割长度>1 个单词?例如 "i.would.like.to.visit.the.U.S.A" 将是 ["i", "would", "like", "to", "visit", "the", "U.S.A"]。对? “a”这个词呢? [一个名词]。所以你只想把大写的缩写放在一起? [美国,但不是美国]
  • 大小写无关紧要 - U.S.A 应该放在一起,但 p.m.如果曾经这样写,也应该保留。两边分裂的长度> 1是我想要完成的。值得庆幸的是,我们似乎没有遇到过任何情况下它是一个单词,然后是一个缩写,更多的是可能发生了一些事情,句子边界被弄乱了。
  • 使用正则表达式吗?
  • 如果有其他方法可以解决这个问题,请告诉我 - 它不必是正则表达式,这正是我开始的地方,因为它似乎是对大量应用更改的最简单方法成绩单。

标签: python-3.x regex regex-lookarounds


【解决方案1】:

好的,所以:D 我已经编写了这段代码,我给了它字符串"i.would.like.to.visit.the.U.S.A.or.the.u.k.while.i.am.eating.a.banana.b"(b 是有目的的,以确保它不会无缘无故删除一个字母),输出是: ['i', 'would', 'like', 'to', 'visit', 'the', 'USA', 'or', 'the', 'uk', 'while', 'i', 'am', 'eating', 'a', 'banana', 'b'].

代码是:

text = "i.would.like.to.visit.the.U.S.A.or.the.u.k.while.i.am.eating.a.banana.b"


def split(string: str):
    string = string.split(".")
    length = len(string) - 1
    obj = enumerate(string)
    together = []
    for index, word in obj:
        sub = []
        if index and len(word) == 1 and index < length:
            idx = index
            while len(string[idx]) == 1:
                sub.append((string[idx], idx))
                idx += 1
                next(obj)
        together.append(sub)
    if together:
        deleted = 0
        for sub in together:
            if len(sub) > 1:
                string[sub[0][1] - deleted:sub[-1][1] + 1 - deleted] = ["".join(x[0] for x in sub)]
                deleted += len(sub) - 1

    return string


print(split(text))

您可以将"".join(x[0] for x in sub) 部分编辑为".".join(x[0] for x in sub) 以保留点(美国而不是美国)

【讨论】:

    【解决方案2】:

    如果您只是想在两边都是两个或更多字符的情况下添加空格,那么您正在寻找以下内容。

    text = re.sub(r"([^\d.]{2})\.([^\d.]{2})", r"\1. \2", text)

    例子:

    "This sentence ends.The following is an abbreviation A.B.C." 变为

    "This sentence ends. The following is an abbreviation A.B.C."

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2015-09-13
      相关资源
      最近更新 更多