【问题标题】:Find specific char inside delimiter在分隔符内查找特定字符
【发布时间】:2021-12-04 05:05:59
【问题描述】:

我有这个字符串:

(40.959953710949506, -74.18210638344726),(40.95891663745299, -74.10606039345703),(40.917472246121065, -74.09582940498359),(40.921752754230255, -74.16397897163398),(40.95248644043785, -74.21067086616523)

我需要获取括号内的逗号以进行进一步处理,并且我希望保留分隔组的逗号。

假设我想用 FOO替换目标逗号,结果应该是:

(40.959953710949506 FOO -74.18210638344726),(40.95891663745299 FOO -74.10606039345703),(40.917472246121065 FOO -74.09582940498359),(40.921752754230255 FOO -74.16397897163398),(40.95248644043785 FOO -74.21067086616523)

我想要一个非特定语言的正则表达式。

【问题讨论】:

  • 为什么要使用正则表达式?这是作业吗?
  • 类似,我需要做一些事情,我不使用语言函数/循环。正则表达式更适合完成它,我想了解它是如何完成的。

标签: regex regexp-replace


【解决方案1】:

将re.sub 与回调函数一起使用:

inp = "(40.959953710949506, -74.18210638344726),(40.95891663745299, -74.10606039345703),(40.917472246121065, -74.09582940498359),(40.921752754230255, -74.16397897163398),(40.95248644043785, -74.21067086616523)"
output = re.sub(r'\((-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)\)', lambda m: r'(' + m.group(1) + r' FOO ' + m.group(2) + r')', inp)
print(output)

打印出来:

(40.959953710949506 FOO -74.18210638344726),(40.95891663745299 FOO -74.10606039345703),(40.917472246121065 FOO -74.09582940498359),(40.921752754230255 FOO -74.16397897163398),(40.95248644043785 FOO -74.21067086616523) P>

这里的策略是在不同的组中捕获每个元组中的两个数字。然后,我们用FOO代替原来的逗号连接这两个数字。

【讨论】:

    【解决方案2】:

    您可以只使用lookaround 来查找前面没有) 的所有,,如下所示:

    (?<!\)),
    

    我不想要一些特定于语言的功能

    上述正则表达式的格式不是特定于语言的,如以下代码片段或this regex101 snippet:

    const x = '(40.959953710949506, -74.18210638344726),(40.95891663745299, -74.10606039345703),(40.917472246121065, -74.09582940498359),(40.921752754230255, -74.16397897163398),(40.95248644043785, -74.21067086616523)';
    
    const rgx = /(?<!\)),/g;
    
    console.log(x.replace(rgx, ' XXX'));

    【讨论】:

      【解决方案3】:

      例如:

      import re
      
      s = "(40.959953710949506, -74.18210638344726),(40.95891663745299, -74.10606039345703),(40.917472246121065, -74.09582940498359),(40.921752754230255, -74.16397897163398),(40.95248644043785, -74.21067086616523)"
      s = re.sub(r",(?=[^()]+\))", " FOO", s)
      print(s)
      
      # (40.959953710949506 FOO -74.18210638344726),(40.95891663745299 FOO -74.10606039345703),(40.917472246121065 FOO -74.09582940498359),(40.921752754230255 FOO -74.16397897163398),(40.95248644043785 FOO -74.21067086616523)
      

      我们使用正向前瞻来仅替换字符串中 ) 位于 ( 之前的逗号。

      【讨论】:

        猜你喜欢
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多