原始代码:
meds = [ "tuberculin Cap(s)", "tylenol Cap(s)", "tramadol 2 Cap(s)"]
for i in meds:
new_meds = i.replace(" Cap(s)", " 1 Cap(s)")
print(new_meds)产出如下:
tuberculin 1 Cap(s)
tylenol 1 Cap(s)
tramadol 2 1 Cap(s)我试图用“Caps”替换所有的药物为"1 Caps“--前2种药物是正确的--但是第3种药物的结果是”曲马多2 1 Caps“。
我应该如何纠正我的脚本,以便所有在字符串中有数字的药物都不会被修改?
最终的结果应该是只有像“结核菌素帽”、“泰诺帽”这样的药物才会被修改,而不是“曲马多2帽”。
发布于 2015-05-06 14:54:36
您可以在re模块 中使用正则表达式
import re
meds = [ "tuberculin Cap(s)", "tylenol Cap(s)", "tramadol 2 Cap(s)"]
meds = [med.replace(" Cap(s)", " 1 Cap(s)") if len(re.findall("[a-zA-Z]+ \d+ Cap\(s\)", med)) == 0 else med for med in meds]
print meds以上打印
['tuberculin 1 Cap(s)', 'tylenol 1 Cap(s)', 'tramadol 2 Cap(s)']按的要求打破了它
您似乎不熟悉清单理解。在python中,任何可迭代的循环都可以循环,就像您对for循环所做的那样。此外,您还可以使用列表理解:
lst = ["one", "two", "three"]
print [element for element in lst]这个打印['one', 'two', 'three']。
现在转到正则表达式.
[ab]将匹配a和b。[a-e]匹配从a到e (包括)的任何字符。+表示“左边的一个或多个东西”--因此,[ab]+将匹配1或多个a's和/或b的任何组合。\d匹配任何数字(可以用0-9替换)。我的正则表达式有三个主要部分:[a-z]+、\d+和Cap\(s\)。将它们结合在一起:
“任何一个或多个字母的组合,后面跟着空格”+“一个或多个数字,后面跟着空格”+“文本‘(S)’”。
re.findall(pattern, string)返回一个列表,其中包含与pattern在string中找到的所有匹配项。因此,它的长度是0,意味着没有匹配。在你的例子中,这意味着没有“药物名称+ number +‘Cap’”。
虽然您可以通过检查字符串是否包含任何数字来实现相同的输入,但这确保它遵循"word + number +‘Cap“的显式模式。
允许药物名称中的数字
如果您希望允许任何序列作为药物名称(例如,带有数字的分子式),您可以将正则表达式更改为[a-zA-Z\d]+ \d+ Cap\(s\),允许任何小写或大写字母以及数字作为名称的一部分。
使用for循环的
如果您想在不使用列表理解的情况下更清楚地编写代码,可以使用常规的for循环:
for index, med in enumerate(meds):
if len(re.findall("[a-zA-Z\d]+ \d+ Cap\(s\)", med)) == 0:
meds[index] = med.replace(" Cap(s)", " 1 Cap(s)")注意,要在for循环中更改列表中的值,您需要要更改的元素的索引(因此是枚举)。如果您对enumerate感到困惑,可以这样编写:
for i in xrange(len(meds)):
if len(re.findall("[a-zA-Z\d]+ \d+ Cap\(s\)", meds[i])) == 0:
meds[i] = meds[i].replace(" Cap(s)", " 1 Cap(s)")枚举
为了扩展for循环中enumerate函数的使用:enumerate返回一个元组列表,其中包含列表(或任何序列)中的索引以及元素:(index, element)。在python中,可以将值解压缩为tuple:a,b = (1,2)。a现在是1,b是2。
发布于 2015-05-06 15:17:15
使用列表理解
In [35]: meds
Out[35]: ['tuberculin Cap(s)', 'tylenol Cap(s)', 'tramadol 2 Cap(s)']
In [36]: new_meds=[ i.replace(" Cap(s)", " 1 Cap(s)") if any(char.isdigit() for char in i) == False else i for i in meds]
In [37]: new_meds
Out[37]: ['tuberculin 1 Cap(s)', 'tylenol 1 Cap(s)', 'tramadol 2 Cap(s)']https://stackoverflow.com/questions/30080047
复制相似问题