Python:regex-lookbacking在单引号或双引号后获取单词



我有一个文件,内容如下。我正试图提取"-x〃;最后只需要获得uniq结果。作为其中的一部分,我尝试了下面的regex,但在输出中只得到了单引号和双引号。当我只对双引号使用regex时,我得到了结果。

文件内容

00 04 * * 2-6   testuser   /get_results.sh -q -x 'igp_srm_m' -s 'yesterday' -e 'yesterday' -m '2048' -b >>'/var/log/process/srm-console.log' 2>&1
00 10 * * 2-6   testuser   /get_results.sh -q -x 'igp_srm_m' -s 'yesterday' -e 'yesterday' -m '2048' -w '720' >>'/var/log/process/srm-console.log' 2>&1
00 08 * * 1-5   testuser   /get_results.sh -q -x "igp_france" -s "today" -e "today" -m "90000" -b -z partA >>"/var/log/process/france-partA-console.log" 2>&1
00 12 * * 2-6   testuser   /get_results.sh -q -x "igp_france" -s "yesterday" -e "yesterday" -m "90000" -w "900" -z partA >>"/var/log/process/france-partA-console.log" 2>&1
00 08 * * 1-5   testuser   /get_results.sh -q -x "igp_france" -s "today" -e "today" -m "90000" -b -z partB >>"/var/log/process/france-partB-console.log" 2>&1
00 12 * * 2-6   testuser   /get_results.sh -q -x "igp_france" -s "yesterday" -e "yesterday" -m "90000" -w "900" -z partB >>"/var/log/process/france-partB-console.log" 2>&1
00 12 * * 2-6   testuser   JAVA_OPTS='-server -Xmx512m' /merge.sh "yesterday" "igp_france" "partA,partB" >>"/var/log/process/france-console.log" 2>&1
00 08 * * 1-5   testuser   /get_results.sh -q -x "igpswitz_france" -s "today" -e "today" -m "15000" -b >>'/var/log/process/igpswitz_france-console.log' 2>&1
00 12 * * 2-6   testuser   /get_results.sh -q -x "igpswitz_france" -s "yesterday" -e "yesterday" -m "15000" -Dapc.maxalerts=8000 -w "900" >>'/var/log/process/igpswitz_france-console.log' 2>&1
30 07 * * 2-6   testuser   /get_results.sh -q -x "igp_franced" -s 'yesterday' -e 'yesterday' -m "105000" -b >>"/var/log/process/franced-console.log" 2>&1
15 12 * * 2-6   testuser   /get_results.sh -q -x "igp_franced" -s 'yesterday' -e 'yesterday' -m "105000" -w "960" >>"/var/log/process/franced-console.log" 2>&1

尝试过的语法

import re
with open ("test2") as file:
for line in file:
try:
m=re.search('(?<=-x ("|'))(w+)',line)
print m.group(1)
except:
m = None

预期输出

igp_srm_m
igp_france
igpswitz_france
igp_franced

接收输出

'
'
"
"
"
"
"
"
"
"

不确定出了什么问题,因为当我只尝试双引号时,它是正确的。

仅用于双引号的工作脚本

import re
with open ("test2") as file:
for line in file:
try:
m = re.search('(?<=-x ")(w*)', line)
print m.group(1)
except:
m = None

接收输出-仅搜索双引号

igp_france
igp_france
igp_france
igp_france
igpswitz_france
igpswitz_france
igp_franced
igp_franced

您可以使用一个集合来获取唯一的值。

在您的模式中,值在第2组中,但您可以稍微优化模式。可以在字符类CCD_ 1中使用单引号和双引号。然后,您可以使用反向引用来使用配对匹配的报价

-x (["'])(w+)1

Regex演示| Python演示

import re
result = set()
with open ("test2") as file:
for line in file:
try:
m = re.search(r"-x (["'])(w+)1", line)
result.add(m.group(2))
except:
m = None
print(result)

输出

{'igp_france', 'igp_srm_m', 'igp_franced', 'igpswitz_france'}

在中

m=re.search('(?<=-x ("|'))(w+)',line)
print m.group(1)

使用组(2(代替组(1(,基本上,

m=re.search('(?<=-x ("|'))(w+)',line)
print m.group(2)

从试用https://regex101.com/,组1将作为'出现,而使用组2将给出所需的输出。

由于所需的输出已在组1中,因此双引号的工作正常。

最新更新