我有一系列要提取的字符串:
hello.this_is("bla bla bla")
some random text
hello.this_is('hello hello')
other stuff
我需要获取(从许多文件中获取,但这在这里并不重要)是hello.this_is(
和)
之间的内容,所以我想要的输出是:
bla bla bla
hello hello
如您所见,括号内的文本可以用双引号或单引号引起来。
如果这只是单引号,我会像这样:
grep -Po "(?<=hello.this_is\(').*(?=')" file
# ^ ^
# returns ---> hello hello
类似地,要从双引号中获取字符串,我会说:
grep -Po '(?<=hello.this_is\(").*(?=")' file
# ^ ^
# returns ---> bla bla bla
但是,我想同时匹配这两种情况,因此它得到单引号和双引号。我尝试使用$''
进行转义,但无法使其正常工作:
grep -Po '(?<=hello.this_is\($'["\']').*(?=$'["\']')' file
# ^^^^^^^^ ^^^^^^^^
我当然可以使用ASCII码说:
grep -Po '(?<=hello.this_is\([\047\042]).*' file
但是我想使用引号和单引号,因为047
和042
对我的代表不如单引号和双引号。
答案 0 :(得分:1)
使用捕获组并按如下所示查找其内容:
grep -Po 'hello\.this_is\(([\047"])((?!\1).|\\.)*\1\)' file
这也关心转义字符,例如hello.this_is("bla b\"la bla")
如果输出应该是括号之间的内容,则同时使用\K
和正向查找:
grep -Po 'hello\.this_is\(([\047"])\K((?!\1).|\\.)*(?=\1\))' file
输出:
bla bla bla
hello hello
答案 1 :(得分:1)
注意:此答案底部的l = [1,2]
df = pd.DataFrame(columns=['x','y'])
df.loc[len(df)] = l
print(df,'\n')
l2 = [3,4]
df.loc[len(df)] = l2
print(df)
x y
0 1 2
x y
0 1 2
1 3 4
命令仅在您的字符串表现良好时才有效,例如
sed
或
"foo"
一旦您的字符串开始出现异常:)就像
'bar'
它将不再起作用。
您的输入看起来像源代码。为了获得稳定的解决方案,我建议使用该语言的解析器来提取字符串。
对于普通用例:
您可以使用"hello \"world\""
。与sed
仅适用于GNU grep的grep -oP
相比,该解决方案应该可以在任何POSIX平台上运行:
sed -n 's/hello\.this_is(\(["'\'']\)\([^"]*\)\(["'\'']\).*/\2/gp' file
# ^^^^^^^^ ^^
# capture group 2 ^
答案 2 :(得分:0)
基于revo和hek2mgl的出色答案,我最终使用了grep
,如下所示:
grep -Po '(?<=hello\.this_is\((["'\''])).*(?=\1)' file
可以解释为:
grep
-Po
使用Perl正则表达式机器,仅打印匹配项'(?<=hello\.this_is\((["'\''])).*(?=\1)'
表达式
(?<=hello\.this_is\((["'\'']))
后向搜索:搜索字符串,以“ hello.this_is(”开头,后跟'
或"
。此外,捕获此最后一个字符以供以后使用。 / li>
.*
匹配所有内容... (?=\1)
直到捕获的字符(即'
或"
)再次出现。此处的关键是使用["'\'']
表示'
或"
。通过执行'\''
,我们关闭了封闭的表达式,并填充了文字'
(必须转义),然后再次打开封闭的表达式。