<p><strong>可以将正则表达式与<a href="https://docs.python.org/2/library/re.html#re.findall" rel="nofollow">re module</a>:</strong></p>
<pre><code>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
</code></pre>
<p><strong>以上图片</strong></p>
^{pr2}$
<p><strong>按要求分解:</p>
<p>你好像不熟悉<a href="https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions" rel="nofollow">list comprehensions</a>。在python中,任何iterable都可以循环,就像对for循环所做的那样。此外,您可以使用列表理解:</p>
<pre><code>lst = ["one", "two", "three"]
print [element for element in lst]
</code></pre>
<p>这将打印<code>['one', 'two', 'three']</code>。在</p>
<p><strong>现在到<a href="http://en.wikipedia.org/wiki/Regular_expression" rel="nofollow">regular expression</a>。</strong></p>
<ul>
<li><p>正则表达式中的方括号(集)表示“选择其中的任何字符”。因此,集合<code>[ab]</code>将同时匹配<code>a</code>和{<cd4>}。</p></li>
<li><p>在集合中,可以有范围。<code>[a-e]</code>匹配从<code>a</code>到{<cd7>}(包括在内)的任何字符。</p></li>
<li><p>regex中的A <code>+</code>表示“左边的一个或多个”-<code>[ab]+</code>因此将匹配1个或多个A和/或b的任何组合。</p></li>
<li><p><code>\d</code>匹配任何数字(可替换为[0-9])。</p></li>
<li><p>任何在正则表达式中有特殊含义的字符,如表示组的“<strong>(</strong>”或“<strong>)</strong>”必须是<a href="http://en.wikipedia.org/wiki/Escape_character" rel="nofollow">escaped</a>或放在方括号内才能匹配。</p></li>
</ul>
<p>我的regex有三个主要部分:<code>[a-z]+</code>,<code>\d+</code>和{<cd13>}。组合匹配项:</p>
<p>“一个或多个字母后跟空格”<strong>+</strong>“一个或多个数字后跟空格”<strong>+</strong>“文本‘大写字母’”。在</p>
<p><code>re.findall(pattern, string)</code>返回一个列表,其中包含在<code>string</code>中找到的<code>pattern</code>的所有匹配项。它的长度是<code>0</code>,因此意味着没有匹配项。在你的案例中,这意味着没有“药物名称”<strong>+</strong>编号<strong>+</strong>“上限”。在</p>
<p>虽然只需检查字符串是否包含任何数字就可以实现相同的输入,但这可以确保它遵循“word+number+'Cap(s)”的显式模式。在</p>
<p><strong>允许在药物名称中使用数字</strong></p>
<p>如果您想允许任何序列作为药物名称(例如,带有数字的分子式),您可以将regex更改为<code>[a-zA-Z\d]+ \d+ Cap\(s\)</code>,允许任何小写或大写字母以及数字作为名称的一部分。在</p>
<p><strong>使用for循环</strong></p>
<p>如果您想在不使用列表理解的情况下更清楚地编写代码,可以使用常规的<code>for</code>循环来完成:</p>
<pre><code>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)")
</code></pre>
<p>注意,要在<code>for</code>循环中更改列表中的值,您需要要更改的元素的索引(因此是<a href="https://docs.python.org/2/library/functions.html#enumerate" rel="nofollow">enumerate</a>)。如果您觉得<code>enumerate</code>令人困惑,可以这样写:</p>
<pre><code>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)")
</code></pre>
<p><strong>枚举</strong></p>
<p>要扩展for循环中<code>enumerate</code>函数的使用:<code>enumerate</code>返回一个<a href="https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences" rel="nofollow">tuples</a>列表,其中包含列表(或任何序列)中的索引以及元素:<code>(index, element)</code>。在python中,可以将值解压到tuple:<code>a,b = (1,2)</code>。<code>a</code>现在是{<cd27>},而{<cd4>}是{<cd29>}。在</p>