Regex 正则表达式前导空格/在标点符号前/后添加尾随空格

Regex 正则表达式前导空格/在标点符号前/后添加尾随空格,regex,Regex,为了更好地清理我的论坛消息语料库,我想删除标点符号之前的前导空格,如果需要的话,在后面添加一个,使用两个正则表达式。后者没有问题((?以下是一个表达式,用于检测需要替换的子字符串: \s*\.\s*(?!\d) 您需要将它们替换为:(一个点和一个空格) 下面是一个演示链接,介绍了该方法的工作原理: 正则表达式的解释: \s*-匹配空格、任意字符数(0-无界) \。-匹配一个点 \s*-同上 (?!\d)-负前瞻。这意味着为了匹配字符串,字符串后面不能跟数字(这将处理您的上一个测试用例) 使用

为了更好地清理我的论坛消息语料库,我想删除标点符号之前的前导空格,如果需要的话,在后面添加一个,使用两个正则表达式。后者没有问题(
(?以下是一个表达式,用于检测需要替换的子字符串:

\s*\.\s*(?!\d)
您需要将它们替换为:
(一个点和一个空格)

下面是一个演示链接,介绍了该方法的工作原理:

正则表达式的解释:

  • \s*
    -匹配空格、任意字符数(0-无界)
  • \。
    -匹配一个点
  • \s*
    -同上
  • (?!\d)
    -负前瞻。这意味着为了匹配字符串,字符串后面不能跟数字(这将处理您的上一个测试用例)

    • 使用
      \p{p}
      匹配所有标点符号。使用
      \h*
      而不是
      \s*
      ,因为
      \s
      也会匹配换行符

      (?<!\d)\h*(\p{P}+)\h*(?!\d)
      
      (?
      将匹配的字符串替换为
      \1


      >x gsub((?示例会更好。您是尝试匹配字符串还是删除空格?@AvinashRaj我添加了一些示例,并更好地说明了(两者)我的需求:)您是否也可以发布预期的输出?@AvinashRaj好的,完成了!tnx@w0lf,它几乎可以工作。但替换仅用于定义的字符(点)而我需要匹配整个类[:punct:]。除此之外,如果有几个连续的标点符号。例如“从前…”或(正如我之前所说!),非常优雅,工作顺利,几乎完美!唯一的小故障是开放式parhentesis(在西方语言中,它有一种落后的行为——它缝合到后面的单词,而不是前面的单词)和hypen(如果单词内部有“牛头”,则不应匹配)。除此之外,它是完美的!这非常顺利地解决了hypen问题(哇,这个正则表达式远远超出了我的理解能力。完美之前的最后一个小故障是open parhentesis行为(它链接到下面的词而不是前面的词)一些标点符号必须缝合到下面的单词,而不是前面的单词。你的正则表达式不加区分地将标点符号链接到前面的单词。例如,在应用正则表达式后:-show(必须继续)--->应该是“show(必须继续)”-工作人员对公主说:“你好,世界!”--->应该是对公主说的话:“你好,世界!”——不要害怕----->应该是“不要害怕”(这可能是唯一的例外:省略字符将两个单词缝合在一起):('“@……我想是的。我试图用一个正则表达式从语法上清理文本……但我担心这不值得。感谢您的大力帮助!这解决了我99.999999%的问题!
      
      (?<!\d)\h*(\p{P}+)\h*(?!\d)
      
      > x <- c('This is the end .Stuff', 'This is the end, Stuff', 'This is the end . Stuff', 'This is a .15mm tube')
      > gsub("(?<!\\d)\\h*(\\p{P}+)\\h*(?!\\d)", "\\1 ", x, perl=T)
      [1] "This is the end. Stuff" "This is the end, Stuff" "This is the end. Stuff"
      [4] "This is a .15mm tube"