У меня есть файл, который создается как это:
(MATH[NUMBER1=(50, unknown, unknown), NUMBER2=(unknown, 4, unknown), OPERATOR='times']
(NUM[SEM=(50, unknown, unknown)] (DIZAINE[SEM=50] cinquante))
(OPERATEUR[SEM='times'] multiplie)
(NUM[SEM=(unknown, 4, unknown)] (UNITE[SEM=4] quatre)))
Как я могу извлечь значения 50, 'времена' и 4?
Я попробовал awk, но существуют круглые скобки, балансирующие проблемы
Если вы хотите извлечь значения без скобок атрибута SEM
, то вы можете сделать это, используя grep
в режиме PCRE:
$ grep -Po '(?<=\[SEM=)[^()]*?(?=\])' file
50
'times'
4
или perl
Сам
$ perl -lne 'print $1 if /(?<=\[SEM=)([^()]*?)(?=\])/' file
50
'times'
4
Оба подхода используют регулярное выражение lookarounds .
С некоторыми re
команды модуля, мы можем соединить сценарий Python как так:
#!/usr/bin/env python3
import sys,re
with open(sys.argv[1]) as fd:
for line in fd:
items = re.findall(r'SEM=[^(]+?\]',line)
for i in items:
tokens = filter( lambda x: x != 'SEM' and x, re.split('=|]',i) )
print("\n".join(tokens))
С Вашим данным входом, который производит:
$ ./get_sem_vals.py ./input.txt
50
'times'
4
Я также взял свободу составлять возможный несколько SEM
значения на той же строке. Если мы изменяем Вашу вторую строку как
(NUM[SEM=(50, unknown, unknown)] (DIZAINE[SEM=50] cinquante, ATHING=[SEM=25]))
сценарий производит следующий вывод:
$ ./get_sem_vals.py ./input.txt
50
25
'times'
4