0

我想出的解决方案见底部。

希望这对你们来说是一个简单的问题。尝试将字符串与列表匹配并仅打印匹配的字符串。我成功使用了 re,但它在句号之后切断了字符串的其余部分。每个 re 的跨度是 0,10,当我在不使用 re 的情况下查看输出时,它是 0,14 而不是 0,10,所以匹配会在这段时间之后切断信息。所以我想学习如何告诉它打印整个跨度或学习一种将 var 字符串匹配到列表并打印确切字符串的新方法。我最初的尝试打印了带有 TESTPR 的任何内容,总共打印了 3 个,我不想打印的其他内容在前面有一个 1,最后一场比赛最后有一个额外的 R。这是我当前的匹配代码:

#OLD See below
for element in catalog:
    z = re.match("((TESTPRR )\w+)", element)
    if z:
        print((z.group()))

Output: TESTPR 105

它应该显示:

Wanted output: TESTPT 105.465

句号后最多保留 3 位小数,仅此而已。我目前正在上一门 Python 课程来学习 Python,并且到目前为止我很喜欢它,但是这门课让我很难过,因为我刚刚通过阅读来学习 re 和匹配,因为我们还没有在课堂上学习过。

我愿意学习一种不同的方法来搜索和匹配一个字符串并只打印那个字符串。对于我打印 3 个结果的第一次尝试是这样的:

catalog = [ long list pulled from API then code here to make it a nice column]
prod = 'TESTPR'
print ([s for s in catalog if prod in s])

当我在 prod 的末尾添加一个空格时,我可以摆脱末尾带有额外字符的匹配,但我不能添加一个空格来对前面有额外字符的匹配做同样的事情。这是针对上面的代码,而不是针对重新匹配代码。谢谢!

下面回答!

4

2 回答 2

0

由于您有兴趣了解匹配字符串和解决问题的方法:请尝试blurwuzzy

在您的情况下,您可以尝试:

from fuzzywuzzy import process

catalog = [long list pulled from API then code here to make it a nice column]
prod = "TESTPR"
hit = process.extractOne(prod, catalog, score_cutoff = 75) #you can adjust this to suit how close the match should be
print(hit[0]) #hit will be sth like ("TESTPT 105.465", 75)

Output: TESTPT 105.465

有关使用fuzzywuzzy 的不同方式的信息,请查看此链接

您可以使用不同的匹配方式,例如:

fuzz.partial_ratio
fuzz.ratio
token_sort_ratio
fuzz.token_set_ratio

为此从fuzzywuzzy导入fuzz

于 2019-03-15T11:52:04.860 回答
0

坚持使用 re.match 并获得正确的正则表达式,以便打印整个比赛并且它不会在句号之后切断数字。

如您在上面看到的,我的原始匹配是 re.match("((TESTPRR )\w+)", element),其中一些 ( 是不需要的,需要添加更多表达式,现在它打印出正确的匹配。见上文对于旧代码,下面是有效的新代码。

# New code, replaced w+ with w*\d*[.,]?\d*$
for element in catalog:
    z = re.match("STRING\w*\d*[.,]?\d*$", element)
    if z:
        print(z.group())
于 2019-03-16T05:04:02.987 回答