首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python :抓取部分看起来像另一个字符串的字符串的最佳方法

Python :抓取部分看起来像另一个字符串的字符串的最佳方法
EN

Stack Overflow用户
提问于 2018-08-03 04:28:59
回答 2查看 261关注 0票数 0

我想要抓取可能不完全匹配的一段字符串。

例如:

代码语言:javascript
复制
str1 = 'invoice#'
str2 = 'sold to wal-mart corp invoice no 91058780'

预期输出

发票第91058780号

这里是str1的有效案例

代码语言:javascript
复制
Invoice number
Invoice Num
Invoice no
Invoice#
Invoice:
inv number

我已经使用了regex表达式,但是中间还有更多的子字符串。我一直使用的正则表达式是INV_regex = re.escape(str1) + r"\.?:?\s?\w+"

有些情况需要更复杂的正则表达式才能捕获,不可能涵盖所有这些情况

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-03 04:48:51

我会使用模糊匹配算法,例如

代码语言:javascript
复制
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上看到的,它得到了我们想要的价值。这样行得通吗?

票数 2
EN

Stack Overflow用户

发布于 2018-08-03 04:49:42

只是为了看看我是否能做到这一点,它应该根据以下假设找到发票和发票编号

  1. invoice始终显示在字符串
  2. 中,发票后面显示的数字是发票编号。

我在发票和数字之间放了一些垃圾,以确保我能够正确地提取它们。它不需要#或no或number。在找到第一组数字后,它还将忽略任何数字。我把str3拆分了,基本上循环是找到发票和一个数字。一旦它在发票后面找到一个数字(str3从发票开始)

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51661686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档