将python搜索正则表达式转换为ruby正则表达式

时间:2019-12-04 23:01:12

标签: regex ruby

我正在尝试将以下python正则表达式转换为ruby

match = re.search(r'window.__APOLLO_STATE__ = JSON.parse\("(.+?)"\);', body)

我已经做了一些digging,Regexp#match应该是我要寻找的东西,但以下内容返回nil。

resp.body.match('^window.__APOLLO_STATE__ = JSON.parse\("(.+?)"\)')

如何转换正则表达式,我在哪里错了?

3 个答案:

答案 0 :(得分:1)

您可以使用

resp.body[/window\.__APOLLO_STATE__ = JSON\.parse\("(.*?)"\);/, 1]

在这里

  • /.../是一种正则表达式文字符号,在定义正则表达式模式时非常方便
  • 文字点被转义,否则,它们匹配除行换行符之外的任何字符
  • .+?更改为.*?以便能够匹配空值(否则,您可能会过度匹配,比修正过度匹配更容易在以后丢弃空匹配项)
  • 1告诉引擎返回ID为2的第一个匹配项的捕获组的值。如果您需要多个匹配项,请使用resp.body.scan(/regex/)

答案 1 :(得分:0)

惯用的方法是使用df['day_of_week'].replace(['8'], '1') df['day_of_week'].describe() 正则表达式匹配运算符:

=~

您可以使用resp.body =~ /^window.__APOLLO_STATE__ = JSON.parse\("(.+?)"\)/ $1等访问捕获组。

如果您不喜欢全局变量的用法,则也可以使用$2方法

Regexp#match

答案 2 :(得分:0)

据我了解,您的字符串类似

str = 'window.__APOLLO_STATE__ = JSON.parse("my dog has fleas");'

,并且您希望提取双引号之间的文本。您可以使用以下不使用捕获组的正则表达式进行操作:

r = /\Awindow\.__APOLLO_STATE__ = JSON\.parse\(\"\K.+?(?=\"\);\z)/

str[r]
  #=> "my dog has fleas"

可以以自由间距模式编写正则表达式以使其具有自记录功能:

r = /
    \A          # match beginning of string
    window\.__APOLLO_STATE__\ =\ JSON\.parse\(\"
                # match substring
    \K          # discard everything matched so far 
    .+?         # match 1+ characters, lazily
    (?=\"\);\z) # match "); followed by end-of-string (positive lookahead)
    /x          # free-spacing regex definition mode

正向超前的内容必须匹配,但不属于返回的匹配项。返回的匹配项的\K指令部分之前的文本都不会匹配。

自由间距模式会在解析表达式之前删除所有空格。因此,必须保护任何预期的空格(例如,"APOLLO_STATE__ = JSON"中的空格)。我已经通过转义空格来做到这一点,这是可以完成的几种方法之一。

相关问题