Извлечь слова между словом «для» и открывающей скобкой »(« в строке темы электронного письма. Строка темы электронного письма является входным - PullRequest
0 голосов
/ 09 мая 2019

Имя клиента указывается после слова «for» и перед открывающей скобкой »(«, которая начинает номер предложения. Мне нужно извлечь имя клиента, чтобы использовать его для поиска сделки на следующем шаге.Самый простой способ установить это? Используя Zapier Extract Pattern или Использовать Zapier Code в Python?

Я пробовал это, и это не сработало. Это казалось многообещающим.

input_data

client = Напоминание: Leruths отправил вам предложение по названию компании (# 642931)

import regex
rgx = regex.compile(r'(?si)(?|{0}(.*?){1}|{1}(.*?)
{0})'.format('for', '('))
s1 = 'client'
for s in [s1]:
m = rgx.findall
for x in m:
print x.strip()

Я также пробовал это, и оно не сработало.

start = mystring.find( 'for' )
end = mystring.find( '(' )
if start != -1 and end != -1:
result = mystring[start+1:end]

Iя ищу название компании, которое будет возвращено в моем примере.

1 Ответ

0 голосов
/ 09 мая 2019

Самый быстрый способ:

start = client.find('for')
end = client.find('(')
result = client[start+4:end-1]
print(result)

с регулярным выражением:

result = re.search(r' for (.*) [(]', client)
print(result.group(1))

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

client = "Reminder: Leruths has sent you a proposal for Business Name (#642931)"

cs = client.split(" ")
name = ""
append = False
for word in cs:
    if "for" == word:
        append = True
    elif word.startswith("("):
        append = False
    if append is True and word != "for":
        name += (word + " ")
name = name.strip()
print(name)

Другой метод:

client = "Reminder: Leruths has sent you a proposal for Business Name (#642931)"

cs = client.split(" ")
name = ""
forindex = cs.index("for")

for i in range(forindex+1, len(cs)):
    if cs[i].startswith("("):
        break
    name += cs[i] + " "
name = name.strip()

print(name)

Выполнение кода ниже дает:

Regex method took 2.3912417888641357 seconds
Search word by word method took 4.78193998336792 seconds
Search with list index method took 3.1756017208099365 seconds
String indexing method took 0.8496286869049072 seconds

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

import re
import time

client = "Reminder: Leruths has sent you a proposal for Business Name (#642931)"

def withRegex(client):
    result = re.search(r' for (.*) [(]', client)
    return(result.group(1))

def searchWordbyWord(client):
    cs = client.split(" ")
    name = ""
    append = False
    for word in cs:
        if "for" == word:
            append = True
        elif word.startswith("("):
            append = False
        if append is True and word != "for":
            name += (word + " ")
    name = name.strip()
    return name

def searchWithListIndex(client):
    cs = client.split(" ")
    name = ""
    forindex = cs.index("for")

    for i in range(forindex+1, len(cs)):
        if cs[i].startswith("("):
            break
        name += cs[i] + " "
    name = name.strip()

    return name

def stringIndexing(client):
    start = client.find('for')
    end = client.find('(')
    result = client[start+4:end-1]
    return result

wr = time.time()
for x in range(1,1000000):
    withRegex(client)
wr = time.time() - wr
print("Regex method took " + str(wr) + " seconds")

sw = time.time()
for x in range(1,1000000):
    searchWordbyWord(client)
sw = time.time() - sw
print("Search word by word method took " + str(sw) + " seconds")

wl = time.time()
for x in range(1,1000000):
    searchWithListIndex(client)
wl = time.time() - wl
print("Search with list index method took " + str(wl) + " seconds")

si = time.time()
for x in range(1,1000000):
    stringIndexing(client)
si = time.time() - si
print("String indexing method took " + str(si) + " seconds")
...