首页 > 解决方案 > 如何在单词中搜索特定字符串

问题描述

我有:

  1. 包含一定数量代码的列表
list1 = ['A1', 'A2.1', 'A2.2','A2.3','A2.4','B1.1','B1.2','B1.3','B1.4','B1.5','B1.6','B1.7','B1.8a','B1.8b','B2.1','B2.2','B2.3','B2.4','B2.5','B2.6','B2.7','B2.8','B2.9','B2.10','B2.11','B2.12','B2.13','B2.14','B2.15','B2.16','B2.17','B2.18','B2.19','B2.20a','B2.20b','B2.20c'] 

(这是整个列表的一部分) 2. 这个字符串,

string1 = "A1Contributo pubblico1559.020• 559.020,00A2.2Cofinanziamentoprivato in denaro122.500• 22.500,00A2.4Entrate generate dalprogetto00• 0,00B2.20aLocali: locazioni eutenze00• 0,00B2.20bImmobili:ammortamenti00• 0,00B2.20cImmobili:manutenzioneordinaria00• 0,00B2.21Attrezzature: noleggi eleasing00• 0,00B2.22Attrezzature:manutenzioni ordinarie00• 0,00B2.23Attrezzature:ammortamenti00• 0,00B2.1Docenza (dipendenti ecollaboratori)00• 0,00B2.14Viaggi di studio deipartecipanti00• 0,00B2.18Materiali diconsumo/materialididattici00• 0,00E1.1UCS ora formazione5.94085• 504.900,00E1.2UCS allievo120403,5• 48.420,00E1.3Costi acofinanziamentoprivato150150• 22.500,00E1.4UCS ora/utente(individuale)15038• 5.700,00"

我想验证 list1 中的元素是否包含在 string1 中以及它们在字符串中的位置。

我的最终目标是从字符串中提取每个代码的相对数量,例如代码“A1”-> 559.020,00,代码“A2.2”-> 22.500,00 等等。

起初我尝试了一个简单的:

for code in list1:
    stringPosition = re.search(code, string1)

但是有了这个解决方案,我对 B2.2、B2.20 等代码有疑问,因为我找到了相同的位置。

所以我试图了解如何在字符串中搜索确切的代码。我看到了这个帖子:

如何在python中检查字符串中的EXACT单词

在Python中匹配字符串中的确切短语

正则表达式在包含精确子字符串的括号之间找到整个子字符串

如何在字符串中搜索单词(完全匹配)?

我尝试应用建议的解决方案(例如使用 r'\w' + (code) + r'\w')但没有成功。

我的第一次尝试:

for code in list1:
    stringPosition = re.search(code, string1)
    if stringPosition != None:
        print(code, stringPosition)
        list2.append(stringPosition)

提前感谢您的任何建议

标签: python-3.x

解决方案


您可以使用正确的正则表达式来做到这一点:

import re
MAGIC_REGEX = "([A-Z]\d+(?:.\d+[a-z]?)?)[^\•]+\• ([\d\.,]+)"
matches = re.findall(MAGIC_REGEX, string1)
print(matches)
filtered = list(filter(lambda x: x[0] in list1, matches))
print(filtered)
number_filtered = list(map(lambda x: (x[0], float(x[1].replace(".", "").replace(",", "."))), filtered))
print(number_filtered)

因为我不确定你到底想要什么,所以我清楚地分开了三个步骤:

  • 在匹配正则表达式之后,你会得到你想要的东西

    匹配 = [('A1', '559.020,00'), ('A2.2', '22.500,00'), ('A2.4', '0,00'), ('B2.20a', '0,00'), ('B2.20b', '0,00'), ('B2.20c', '0,00'), ('B2.21', '0,00'), ( 'B2.22', '0,00'), ('B2.23', '0,00'), ('B2.1', '0,00'), ('B2.14', '0 ,00'), ('B2.18', '0,00'), ('E1.1', '504.900,00'), ('E1.2', '48.420,00'), ('E1 .3', '22.500,00'), ('E1.4', '5.700,00')]

  • 过滤是当您仅获得列表中的代码时(注意区别是 B2.21-23 和所有 E 代码,因为它们不在您的列表中)

    过滤 = [('A1', '559.020,00'), ('A2.2', '22.500,00'), ('A2.4', '0,00'), ('B2.20a', '0,00'), ('B2.20b', '0,00'), ('B2.20c', '0,00'), ('B2.1', '0,00'), ( 'B2.14', '0,00'), ('B2.18', '0,00')]

  • 将值转换为浮点数,您需要删除第一个点并将逗号更改为一个点

    number_filtered = [('A1', 559020.0), ('A2.2', 22500.0), ('A2.4', 0.0), ('B2.20a', 0.0), ('B2.20b', 0.0) , ('B2.20c', 0.0), ('B2.1', 0.0), ('B2.14', 0.0), ('B2.18', 0.0)]


推荐阅读