извлечение строки между 2 строками - PullRequest
0 голосов
/ 29 августа 2018

Я довольно новичок в python и пытаюсь извлечь строку между 2 строками, используя код с zapier, используя python. пример: dfsgsdfgsdfgsdfgsdfgsdfg Сервис: что я пытаюсь извлечь Подробная информация о клиенте: gfdgsdfgsdfgsdfgsdfg Входная строка называется «описание» и я пытаюсь извлечь то, что находится между строкой 'Service:' и 'Customer Details:'

Я использовал следующий код

import re
match = re.search(r'Service:(.*?)Customer Details:',input_data['description'])
return {'description': match}

, что успешно при тестировании, но возвращает описание: null '

Я тоже пробовал с этим кодом:

myString=input_data['description']
mySubstring=myString[myString.find("Service:")+8:myString.find("Customer Details:")-17]
return {mySubstring}

Я получаю ошибку 'SyntaxError: неверный синтаксис (usercode.py, строка 8)'

Если бы кто-то мог мне помочь, это было бы очень признательно Спасибо!

ОБНОВЛЕНИЕ 1: Спасибо Abion47 за вашу помощь. Я поставил следующий код.

import re
input = input_data['description']
match = re.search(r'Service:(.*?)Customer Details:', input).group(1)
print match 

Я получил ошибку ниже:

Traceback (most recent call last):
File "/tmp/tmpmvAChp/usercode.py", line 10, in the_function match = re.search(r'Service:(.*?)Customer Details:', input).group(1)
AttributeError: 'NoneType' object has no attribute 'group'

ОБНОВЛЕНИЕ 2 ошибка выше была вызвана тем, что код не нашел строку и, таким образом, возвратил что-то пустое.

вот мой вводимый текст, пришедший из календарного события Google:

Appointment Details
Provider: John Smith 
Service: Adult Consultation
Customer Details:
Name: John Doe
Notes: Hi ghdfhdfg, dfghdfgg appointment I had for the 6th of January at 9.30 with this one. Is it possibile?
Status: Confirmed

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

import re
name = input_data['description']
print name
try:
    try:
        name = re.search(r'(?s)(?<=Name:)(.*?)(?=Customer Details:)', input_data['description']).group(1).strip("\n\r ")
    except AttributeError:
        name = re.search(r'(?s)(?<=Name:)(.*?)(?=Customer Details:)', input_data['description']).group(1)
except AttributeError:
name = re.search(r'(?s)(?<=Name:)(.*?)(?=Customer Details:)', input_data['description'])
return { 'name': name }

но я получил следующий результат, он не нашел мою строку, хотя она там есть!

name: null
runtime_meta
duration_ms: 0
memory_used_mb: 23
logs
    1. Appointment Details
    2. Provider: John Smith 
    3. Service: Adult Consultation
    4. Customer Details:
    5. Name: John Doe
    6. Notes: Hi ghdfhdfg, dfghdfgg appointment I had for the 6th of January at 9.30 with this one. Is it possibile?
    7. Status: Confirmed
id: vbgOSvUOsBO8tAuLjk4wP0JMsMWsL0WV

Если кто-то знает, что не так в коде, он будет очень признателен!

КОД РАБОТЫ

Спасибо @ abion47 за помощь, полный рабочий код:

import re
name = input_data['description']
print name
myMatch = re.search(r'Service: (.*?)[\r\n]+Customer Details:', name).group(1)
print myMatch
return { 'myMatch': myMatch }

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете сделать это с помощью Regex, используя следующие команды в оболочке:

input = "dfsgsdfgsdfgsdfgsdfgsdfg Service: what i 'm trying to extract Customer Details: gfdgsdfgsdfgsdfgsdfg"
match = re.search(r'Service:(.*?)Customer Details:', input).group(1)
print match

# Will print " what i 'm trying to extract "

РЕДАКТИРОВАТЬ:

Вот почему так важно в первый раз опубликовать Минимальный, Полный и Проверяемый пример в вашем вопросе. Если мы не знаем точных данных , с которыми вы работаете, то мы должны сделать предположения, которые могут быть ошибочными и привести нас к ответам, которые вы не сможете использовать. Теперь, когда вы предоставили нам фактические входные данные, я могу сразу сказать вам, почему ваши подходы не работают.

Ваш подход к подстроке (о котором я могу только догадываться, потому что вы еще не опубликовали этот полный сценарий, поэтому мы не можем знать, что такое «строка 8»), вероятно, сломается, потому что после добавления 8 в начальный индекс и вычитания 17 из конечного индекса, конечный индекс становится меньше, чем начальный индекс, что является ошибкой.

Подстрокоподобный подход Vicrobot неадекватен, потому что в вашей строке больше вещей, которые могут начинаться с буквы «C», чем просто «Сведения о клиенте», и существует множество двоеточий, которые могут совпадать с тем, с которым он пытается (но не в строке образца, которую вы нам дали).

Ваш и мой подход к регулярным выражениям не работают, потому что ваша входная строка содержит символы новой строки, которые необходимо учитывать, иначе шаблоны регулярных выражений не будут соответствовать должным образом.

Вот как вы можете справиться с этим в обоих случаях:

input = '''Appointment Details
Provider: John Smith 
Service: Adult Consultation
Customer Details:
Name: John Doe
Notes: Hi ghdfhdfg, dfghdfgg appointment I had for the 6th of January at 9.30 with this one. Is it possibile?
Status: Confirmed'''

# Option 1: Substring

mySubstring = input[ input.find('Service: ')+9 : input.find('\nCustomer Details:') ]
print mySubstring

# Option 2: Regex

import re
myMatch = re.search(r'Service: (.*?)[\r\n]+Customer Details:', input).group(1)
print myMatch

Рабочий пример для Repl.it

Учитывая два варианта, я бы использовал подход Regex. Это стандартный способ разбора текста, который обычно менее подвержен ошибкам. (Во многих случаях он также может работать быстрее, чем фильтр подстрок, и я подозреваю, что это один из них.)

0 голосов
/ 29 августа 2018

Я думаю, что вы воспринимаете атрибут find объекта String неправильно. Возвращает индекс первого символа строки, заданного как input; найдя его в строковом объекте.

В вашем случае; если вы пытаетесь это сделать; Вы можете использовать это: -

>>> myString="dfsgsdfgsdfgsdfgsdfgsdfg Service: what i 'm trying to extract Customer Details: gfdgsdfgsdfgsdfgsdfg"
>>> mySubstring = myString[ myString.find(":")+1 : myString.find("C")-1 ]
>>> mySubstring
" what i 'm trying to extract "
>>> 

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

...