Python обработка файлов и текста - PullRequest
0 голосов
/ 09 марта 2020

Итак, я новичок в Python и хочу сделать следующее.

У меня есть файл с кучей предложений, который выглядит следующим образом:

- [frank bora three](noun) [go](action) level [three hundred sixty](value)
- [jack blad four](noun) [stay](action) level [two hundred eleven](value)

Я хочу чтобы иметь возможность воспроизвести файл, который выглядит следующим образом:

text:'frank bora three', entityType:'noun'
text:'jack blad four', entityType:'noun'   
text:'go', entityType:'action'    
text:'stay', entityType:'action'
text:'three hundred sixty', entityType:'value'
text:'two hundred eleven', entityType:'value'

Мне нужно удалить первую гифу, идентифицировать каждый текст, заключенный в квадратные скобки, как текст, а затем их сущность. будет то, что мы имеем между круглыми скобками, который следует за текстом между квадратными скобками. дело в том, что у нас могут быть некоторые слова, которые не заключены в квадратные скобки и которые следует игнорировать.

Подход. Первое, что я попытался сделать, это поместить все предложения в массив:

import re
with open('new_file.txt') as f1:
    lines = f1.readlines()
array_length = len(lines)
for i in range(array_length):
    lines[i]=re.sub(r"\b/-\w+", "", lines[i])
print (lines[0])

После этого я попытался удалить гимф, используя re, но у меня это не сработало, при попытке распечатать массив гифы все еще были там.

Надеюсь, мой вопрос понятен.

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 09 марта 2020

При разборе сложной строки часто бывает проще использовать двухэтапный подход. Если мы сначала разбиваем каждую строку:

temp = foo.split(')')[0:3]

дает для первой строки список строк:

temp = ['[frank bora three](noun', ' [go](action', ' level [three hundred sixty](value']

Теперь мы можем написать более простые регулярные выражения, чтобы извлечь нужный текст из каждого подстрока:

re_text = re.compile(r'\[.+\]')
re_entity = re.compile(r'\(.+')
mytext = []
myentitites = []
for target in temp:
     mytext.append(re.search(re_text, target).group().strip('[]'))
     myentities.append(re.search(re_entity, target).group().strip('()'))

Итак, теперь у вас есть два списка:

mynouns = ['frank bora three', 'go', 'three hundred sixty']
myentities = ['noun', 'action', 'value']

Сожмите их вместе и создайте новый список пар кортежей:

result = list(zip(mynouns, myentities)) #fix

, который выглядит вот так:

[('frank bora three', 'noun'),
 ('go', 'action'),
 ('three hundred sixty', 'value')]

И теперь вы можете записать их в строку. (Чтобы сгруппировать этот набор строк для желаемого результата, вы можете составить список строк и затем отсортировать его по последнему слову перед выводом в файл)

1 голос
/ 09 марта 2020

Вы не нуждаетесь в регулярном выражении:

Просто строка, разделенная скобками:)

s = "- [frank bora three]asdasd(noun) [go](action) level [three hundred sixty](value)"

print(s[s.find("[")+1:s.find("]")]) #text inside []
print(s[s.find("(")+1:s.find(")")]) #noun inside ()

Теперь вам нужно использовать тростник в вашем файле, а l oop более :

stringfile = """- [frank bora three](noun) [go](action) level [three hundred sixty](value)
- [jack blad four](noun) [stay](action) level [two hundred eleven](value)"""


for s in stringfile.splitlines():
    text = s[s.find("[")+1:s.find("]")]
    noun = s[s.find("(")+1:s.find(")")]

    print(text)
    print(noun)
...