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)
我试图用#34;帽子替换所有的药物"进入" 1 Cap(s)" 前2个药物是正确的,但第3个药物导致"曲马多2 1个帽子"。
我应该如何更正我的脚本,以便所有字符串中包含数字的meds都不会被修改?
最终结果应该是只有类似于"结核菌素帽"," tylenol Cap(s)"得到修改而不是" tramadol 2 Cap(s)"。
答案 0 :(得分:1)
您可以将正则表达式与re module:
一起使用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)']
按要求分解:
您似乎不熟悉list comprehensions。在python中,任何可迭代都可以循环,就像你使用for循环一样。此外,您可以使用列表理解:
lst = ["one", "two", "three"]
print [element for element in lst]
这会打印['one', 'two', 'three']
。
现在转到regular expression。
正则表达式中的方括号(集)表示“选择其中的任何字符”。因此,集[ab]
会匹配a
和b
。
在集合中,您可以拥有范围。 [a-e]
匹配a
到e
(包括)的所有字符。
正则表达式中的+
表示“左侧的一个或多个内容” - [ab]+
因此匹配1个或多个a和/或b的任意组合。
\d
匹配任何数字(可以替换为[0-9])。
任何在正则表达式中具有特殊含义的字符 - 例如“('或')'表示组 - 必须为escaped或放在方括号内进行匹配。
我的正则表达式有三个主要部分; [a-z]+
,\d+
和Cap\(s\)
。将它们组合起来匹配:
“1个或多个字母后跟空格” + “的任意组合”一个或多个数字后跟空格“ + ”文字'封面(s) “”。
re.findall(pattern, string)
会返回一个列表,其中包含pattern
中找到的string
所有匹配项。它的长度为0
因此意味着没有匹配。在您的情况下,这意味着没有“药物名称 + 数字 + 'Cap(s)'”。
虽然你可以通过检查字符串是否包含任何数字来实现相同的输入,但这确保它遵循“word + number +'Cap(s)'”的显式模式。
允许药物名称中的数字
如果您想允许任何序列作为药物名称(例如带有数字的分子式),您可以将正则表达式更改为[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)。如果您发现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
返回包含列表中的索引(或任何序列)的tuples列表以及元素: (index, element)
。在python中,您可以在元组中解压缩值:a,b = (1,2)
。 a
现在为1
,b
为2
。
答案 1 :(得分:0)
使用列表理解
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)']
答案 2 :(得分:0)