【问题标题】:adding space before and after a comma and dash in python using regex使用正则表达式在python中的逗号和破折号前后添加空格
【发布时间】:2021-07-20 06:15:31
【问题描述】:

我已经看过很多关于此的主题,也许我不理解某些东西,但是用这样的一句话:

“hello-goodbye C-GOOD”或“100.89 D-FARM” 我想在诸如“.,-”之类的字符之前和之后添加一个空格,但我不想在 C-GOOD 或 D-FARM"

这是我想要的最终结果: “你好 - 再见 C-GOOD” “100 . 89 D-FARM” 但无论我尝试什么,我要么在所有内容上都有空格,要么在任何破折号上都没有空格:

我要么得到:“hello - goodbye C - GOOD”“100 . 89 D - FARM”要么 "你好-再见 C-GOOD" "100 . 89 D-FARM" 这是我尝试过的:

text= re.sub(r'([.,!?()-]+)^(?<!C)', r' \1 ', text)
text= re.sub(r'([.,!?()-]+)^(?<!C-)', r' \1 ', text)
text= re.sub(r'([.,!?()-]+)(?<!C-GOOD)', r' \1 ', text)
text= re.sub(r'([.,!?()-]+)(?!C-GOOD)', r' \1 ', text)

如果有人可以帮助或知道我做错了什么,那就太好了。谢谢。

【问题讨论】:

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


    【解决方案1】:

    不匹配 .,- 连接大写字母。

    import re
    
    s = "hello-goodbye C-GOOD 100.89 D-FARM"
    
    print(re.sub("(?<![A-Z])([.,-])(?![A-Z]+)", r" \g<1> ", s))
    # hello - goodbye C-GOOD 100 . 89 D-FARM
    

    【讨论】:

    • 此解决方案还可以保留B-FARM 之类的内容,其- 应该替换为两边的空格。
    • 非常感谢,效果很好。如果可能的话,您知道为什么我以前的解决方案不起作用吗?
    • @SamSaidYes 我认为匹配模式的定义需要排序。例如:^ 需要在开头,(?&lt;!...) 需要在要匹配的字符串前面。您可能需要阅读documentation 以了解如何使用它。
    【解决方案2】:

    我们可以在这里使用re.sub和一个回调函数,这将排除C-GOODD-FARM被替换:

    inp = ["hello-goodbye C-GOOD", "100.89 D-FARM"]
    def repl(m):
        if m.group() == "C-GOOD" or m.group() == "D-FARM":
            return m.group()
        else:
            return " - "
    output = [re.sub(r'C-GOOD|D-FARM|[.,-]', repl, x) for x in inp]
    print(output)  # ['hello - goodbye C-GOOD', '100 - 89 D-FARM']
    

    这里的技巧在于正则表达式模式C-GOOD|D-FARM|[.,-],它将尝试匹配C-GOODD-FARM 之前 尝试也匹配逗号、点或破折号。 re.sub 然后将此匹配传递给回调函数,该函数仅在 [.,-] 分隔符的情况下添加空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多