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