我正在尝试将以下python正则表达式转换为ruby
match = re.search(r'window.__APOLLO_STATE__ = JSON.parse\("(.+?)"\);', body)
我已经做了一些digging,Regexp#match应该是我要寻找的东西,但以下内容返回nil。
resp.body.match('^window.__APOLLO_STATE__ = JSON.parse\("(.+?)"\)')
如何转换正则表达式,我在哪里错了?
答案 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"
中的空格)。我已经通过转义空格来做到这一点,这是可以完成的几种方法之一。