我一直在努力挑战极富挑战性的弦乐。
例如,
str1 = '95% for Pikachu, 92% for Sandshrew'
str2 = '70% for Paras & 100% Arcanine'
str3 = '99% Diglett, 40% Dugtrio'
str4 = '10% Squirtle, 100% for Alakazam'
str5 = '30% Metopod & 99% Dewgong'
字符串以%
整数开头,可能有for
或没有,然后以神奇宝贝的名字开头。可能有comma(,)
或&
符号,然后是新的%
整数。最后是宠物小精灵的另一个名字(全部以大写字母开头),
我想提取两个宠物小精灵,例如result,
['Pikachu', 'Sandshrew']
['Paras', 'Arcanine']
['Diglett', 'Dugtrio']
['Squirtle', 'Alakazam']
['Metopod', 'Dewgong']
我可以使用in
语法创建所有宠物小精灵的列表,但这不是最好的方法(以防他们添加更多宠物小精灵)。是否可以使用Regex提取?
提前致谢!
编辑
根据要求,我正在添加代码,
str_list = [str1, str2, str3, str4, str5]
for x in str_list:
temp_list = []
if 'for' in x:
temp = x.split('% for', 1)[1].strip()
temp_list.append(temp)
else:
temp = x.split(" ", 1)[1]
temp_list.append(temp)
print(temp_list)
我知道这不是正则表达式。我尝试过的表达式是\d+
提取整数以开始...但是不知道如何开始。
EDIT2
@b_c具有良好的边缘情况,因此,我将其添加到此处
edge_str = '100% for Pikachu, 29% Pika Pika Pikachu'
结果
['Pikachu', 'Pika Pika Pikachu']
希望我并没有为此过度设计,但是我想介绍稍微复杂一点的命名宠物小精灵的边缘案例,例如“ Mime。Mime”,“ Farfetch'd”和/或“Nidoran♂”(仅看看第151页)。
我使用的模式是(?:(?:\d+%(?: |for)+([A-Z](?:[\w\.♀♂']|(?: (?=[A-Z])))+))+)[, &]*
,它似乎可以在我的测试中正常工作(这是regex101链接,用于分类)。
对于一般的摘要,我正在寻找:
[\w\.♀♂']
位)中。除非更改,否则Python的内置re
模块不支持重复捕获组(我相信我做对了),因此我只是将re.findall
它们成对使用并组织成对(我将输入中的几个名称替换为复杂的名称):
import re
str1 = '95% for Pikachu, 92% for Mr. Mime'
str2 = '70% for Paras & 100% Arcanine'
str3 = '99% Diglett, 40% Dugtrio'
str4 = "10% Squirtle, 100% for Farfetch'd"
str5 = '30% Metopod & 99% Nidoran♂'
pattern = r"(?:(?:\d+%(?: |for)+([A-Z](?:[\w\.♀♂']|(?: (?=[A-Z])))+))+)[, &]*"
# Find matches in each string, then unpack each list of
# matches into a flat list
all_matches = [match
for s in [str1, str2, str3, str4, str5]
for match in re.findall(pattern, s)]
# Pair up the matches
pairs = zip(all_matches[::2], all_matches[1::2])
for pair in pairs:
print(pair)
然后打印出来:
('Pikachu', 'Mr. Mime')
('Paras', 'Arcanine')
('Diglett', 'Dugtrio')
('Squirtle', "Farfetch'd")
('Metopod', 'Nidoran♂')
另外,正如已经提到的,您确实在口袋妖怪名称中有一些错别字,但是不幸的是,正则表达式不是正确的解决方法:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句