我想要抓取可能不完全匹配的一段字符串。
例如:
str1 = 'invoice#'
str2 = 'sold to wal-mart corp invoice no 91058780'
预期输出
发票第91058780号
这里是str1
的有效案例
Invoice number
Invoice Num
Invoice no
Invoice#
Invoice:
inv number
我已经使用了regex表达式,但是中间还有更多的子字符串。我一直使用的正则表达式是INV_regex = re.escape(str1) + r"\.?:?\s?\w+"
有些情况需要更复杂的正则表达式才能捕获,不可能涵盖所有这些情况
发布于 2018-08-03 04:48:51
我会使用模糊匹配算法,例如
from fuzzywuzzy import fuzz
a = 'invoice#'
b = 'sold to wal-mart corp invoice no 91058780'
for word in b.split():
print(a, word, '-->',fuzz.partial_ratio(word,a))
get_word = [word for word in b.split() if fuzz.partial_ratio(word,a)>98]
print(get_word)
正如你在下面的jupyter notebook上看到的,它得到了我们想要的价值。这样行得通吗?
发布于 2018-08-03 04:49:42
只是为了看看我是否能做到这一点,它应该根据以下假设找到发票和发票编号
我在发票和数字之间放了一些垃圾,以确保我能够正确地提取它们。它不需要#或no或number。在找到第一组数字后,它还将忽略任何数字。我把str3拆分了,基本上循环是找到发票和一个数字。一旦它在发票后面找到一个数字(str3从发票开始)
def isInv(strn):
leng = len('invoice')
print(leng)
pos = strn.find('invoice')
strn = strn[pos:leng]
if strn == 'invoice':
return(1)
return(0)
def dig(strn):
if strn.isdigit()==True:
return(1)
return(0)
str1 = 'invoice'
str2 = 'sold to invoice testing garbage 91058780 12345 wal-mart 12345673 corp'
fullLen = len(str2)
RelvLen = totalLen = str2.find(str1)
str3 = str2[totalLen:fullLen]
x = str3.split()
finlLst = []
for t in x:
itm = isInv(t)
if itm > 0:
finlLst.append(t)
itm = dig(t)
if itm > 0:
finlLst.append(t)
inv = finlLst[0] + " " + finlLst[1]
print(inv)
https://stackoverflow.com/questions/51661686
复制相似问题