在给定特定条件的情况下替换Python中的字母

时间:2015-05-06 14:43:57

标签: python

原始代码:
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)"。

3 个答案:

答案 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]会匹配ab

  • 在集合中,您可以拥有范围。 [a-e]匹配ae(包括)的所有字符。

  • 正则表达式中的+表示“左侧的一个或多个内容” - [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现在为1b2

答案 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)

&lt; p&gt;您可以这样使用RegEx:&lt; / p&gt; &lt; pre&gt;&lt; code&gt; import re meds = [&#34; tuberculin Cap(s)&#34;,&#34; tylenol Cap(s)&#34;,&#34; tramadol 2 Cap(s)&#34;] 对于我在医学中:     如果不是re.match(&#34;。+ \ d。+&#34;,i):         new_meds = i.replace(&#34; Cap(s)&#34;,&#34; 1 Cap(s)&#34;)     其他:         new_meds = i     打印(new_meds) &LT; /代码&GT;&LT; /预&GT; &LT p为H.;输出:其中/ p为H. &lt; pre&gt;&lt; code&gt; tuberculin 1 Cap(s) tylenol 1 Cap(s) 曲马多2个上限 &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;表达式&lt; code&gt;&#34;。+ \ d。+&#34;&lt; / code&gt;会找到包含&#34;某事+数字+某事&#34;的项目。&lt; / p&gt;