提取2个字符串之间的字符串

时间:2018-08-28 21:08:37

标签: string zapier

我是python的新手,我正尝试使用python使用zapier的代码在2个字符串之间提取一个字符串。 示例:dfsgsdfgsdfgsdfgsdfgsdfg服务:我要提取的内容客户详细信息:gfdgsdfgsdfgsdfgsdfg 输入的字符串称为“描述” 并且我正在尝试提取字符串“服务:”和“客户详细信息:”之间的内容

我使用了以下代码

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

在测试中成功,但是返回'description: 空”

我也尝试过使用以下代码:

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 :(得分:0)

我认为您错误地采用了find对象的String属性。它返回作为输入给出的字符串的第一个字符的索引;通过在字符串对象中找到它。

在您的情况下;如果您正在尝试做到这一点;您可以使用以下一种:-

>>> 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 "
>>> 

它的作用是只查找给定char的索引,然后剥离字符串对象并为您提供所需的结果。

答案 1 :(得分:0)

您可以使用Shell中的以下命令对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 "

编辑:

这就是为什么在您的问题中第一次发布Minimal, Complete, and Verifiable Example很重要的原因。如果我们不知道您正在使用的确切数据,那么我们就必须进行假设,这很容易出错,并导致我们给您无法使用的答案。现在,您已向我们提供了实际的输入数据,我可以立即告诉您为什么您的方法不起作用。

您的子字符串方法(我只能推测是因为您仍然没有发布完整的脚本,所以我们不知道哪个是“第8行”)可能会中断,因为在将8加到起始索引并减去后从结束索引开始17,结束索引变得小于开始索引,这是一个错误。

Vicrobot的子字符串方法是不够的,因为字符串中可以以“ C”开头的内容比“ Customer Details”还多,并且可以与其他冒号进行匹配(而不是要与之匹配的冒号),但是(在您给我们的示例字符串中)。

您和我的regex方法均无效,因为您的输入字符串包含需要考虑的换行符,否则regex模式将无法正确匹配。

这是在两种情况下的处理方式:

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

Working example on Repl.it

鉴于这两种选择,我将使用Regex方法。这是进行文本解析的标准方法,通常不易出错。 (在许多情况下,它的运行速度也比子字符串过滤器快,我怀疑这是其中之一。)