我有这个python字符串:
string = '"/dev/null" "" "19/1333329478.9381399" 0 1 "cam-foo" 64 900.0 "Foo x rev scan of test" "/usr/bin/env ""PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"" python app.py" 60.145855 2.034689'
我需要一个正则表达式,它给出了这个字符串中每个元素的列表。 元素:双引号中包含的任何数字或任何字符串。字符串可以包含双引号。
我出来了这个正则表达式:
import re
p = re.compile(r'"[^"]*"|[-\.\d]+')
p.findall(string)
['"/dev/null"', '""', '"19/1333329478.9381399"', '0', '1', '"cam-foo"', '64', '900.0', '"Foo x rev scan of test"', '"/usr/bin/env "', '"PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"', '" python app.py"', '60.145855', '2.034689']
正如你所看到的,我错过了字符串中双引号的部分。 应忽略元素内的双引号。我想得到这样的结果:
['"/dev/null"', '""', '"19/1333329478.9381399"', '0', '1', '"cam-foo"', '64', '900.0', '"Foo x rev scan of test"', '"/usr/bin/env ""PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"" python app.py"', '60.145855', '2.034689']
而是拥有3个(或更多)元素
[..., '"/usr/bin/env "', '"PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"', '" python app.py"', ...]
我想只有一个元素:
'"/usr/bin/env ""PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"" python app.py"'
任何人都可以帮助我?
答案 0 :(得分:3)
您可以使用csv
module。
>>> import csv
>>> from pprint import pprint
>>> pprint(list(csv.reader([string], delimiter=' ', quotechar='"')))
[
[
'/dev/null'
,
''
,
'19/1333329478.9381399'
,
'0'
,
'1'
,
'cam-foo'
,
'64'
,
'900.0'
,
'Foo x rev scan of test'
,
'/usr/bin/env "PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH" python app.py'
,
'60.145855'
,
'2.034689'
]
]
答案 1 :(得分:2)
正则表达式的前半部分当前匹配一对双引号,包含零个或多个非双引号字符。
r'"[^"]*"'
您可以通过更改周围双引号内匹配的字符串来实现所需的结果。
r'"(?:[^"]|"")*"'
这个正则表达式匹配一对双引号,它们包含零个或多个字符串;每个字符串必须包含一个非双引号字符或两个连续的双引号。 (?:
将带括号的位标记为非捕获组;否则Python将仅返回括号内的位。)
让我们把它插入你的完整正则表达式:
% python
Python 2.7.2 (default, Mar 20 2012, 13:27:18)
[GCC 4.2.1 Compatible Apple Clang 3.1 (tags/Apple/clang-318.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> s = '"/dev/null" "" "19/1333329478.9381399" 0 1 "cam-foo" 64 900.0 "Foo x rev scan of test" "/usr/bin/env ""PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"" python app.py" 60.145855 2.034689'
>>> for el in re.findall(r'"(?:[^"]|"")*"|[-\.\d]+', s): print(el)
...
"/dev/null"
""
"19/1333329478.9381399"
0
1
"cam-foo"
64
900.0
"Foo x rev scan of test"
"/usr/bin/env ""PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"" python app.py"
60.145855
2.034689
>>>
答案 2 :(得分:1)
如果你只需要能够分割这个确切的案例,你可以使用shlex.split()
:
>>> import shlex
>>> s = '"/dev/null" "" "19/1333329478.9381399" 0 1 "cam-foo" 64 900.0 "Foo x rev scan of test" "/usr/bin/env ""PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH"" python app.py" 60.145855 2.034689'
>>> shlex.split(s)
['/dev/null', '', '19/1333329478.9381399', '0', '1', 'cam-foo', '64', '900.0', 'Foo x rev scan of test', '/usr/bin/env PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH python app.py', '60.145855', '2.034689']
>>> shlex.split(s)[-3]
'/usr/bin/env PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$PATH python app.py'
这不是正则表达式,但它每次都会为你解决这个问题。
答案 3 :(得分:0)
将正则表达式搜索令牌包含在()中。 发生的事情是,每次查找都会返回列表。 选择正确的数组元素。 E.g:
m = p.findall(string)
将返回m中的列表,其中每个元素根据()中包含的内容再次成为标记列表。 这样,您就可以检索所需语句的确切部分。