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

2024-06-16 11:50:26 发布

您现在位置: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)
输出为: ^{pr2}$

我想把所有的药都换成1个 前2次给药正确,第3次给药后出现“曲马多21帽”。在

我应该如何更正我的脚本,以使字符串中带有数字的所有药品都不会被修改?在

最终的结果应该是只有“结核菌素帽”、“泰诺帽”这样的药物被修改,而不是“曲马多2帽”。在


Tags: 字符串in脚本newforreplacecapprint
3条回答

可以通过以下方式使用RegEx:

import re
meds = [ "tuberculin Cap(s)", "tylenol Cap(s)", "tramadol 2 Cap(s)"]

for i in meds:
    if not re.match(".+\d.+", i):
        new_meds = i.replace(" Cap(s)", " 1 Cap(s)")
    else:
        new_meds = i
    print(new_meds)

输出:

^{pr2}$

表达式".+\d.+"将找到具有“something+digit+something”的项。在

可以将正则表达式与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

以上图片

^{pr2}$

按要求分解:

你好像不熟悉list comprehensions。在python中,任何iterable都可以循环,就像对for循环所做的那样。此外,您可以使用列表理解:

lst = ["one", "two", "three"]
print [element for element in lst]

这将打印['one', 'two', 'three']。在

现在到regular expression

  • 正则表达式中的方括号(集)表示“选择其中的任何字符”。因此,集合[ab]将同时匹配a和{}。

  • 在集合中,可以有范围。[a-e]匹配从a到{}(包括在内)的任何字符。

  • regex中的A +表示“左边的一个或多个”-[ab]+因此将匹配1个或多个A和/或b的任何组合。

  • \d匹配任何数字(可替换为[0-9])。

  • 任何在正则表达式中有特殊含义的字符,如表示组的“”或“”必须是escaped或放在方括号内才能匹配。

我的regex有三个主要部分:[a-z]+\d+和{}。组合匹配项:

“一个或多个字母后跟空格”+“一个或多个数字后跟空格”+“文本‘大写字母’”。在

re.findall(pattern, string)返回一个列表,其中包含在string中找到的pattern的所有匹配项。它的长度是0,因此意味着没有匹配项。在你的案例中,这意味着没有“药物名称”+编号+“上限”。在

虽然只需检查字符串是否包含任何数字就可以实现相同的输入,但这可以确保它遵循“word+number+'Cap(s)”的显式模式。在

允许在药物名称中使用数字

如果您想允许任何序列作为药物名称(例如,带有数字的分子式),您可以将regex更改为[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中,可以将值解压到tuple:a,b = (1,2)a现在是{},而{}是{}。在

使用列表理解

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)']

相关问题 更多 >