我在找出如何使用(即使有可能)将字符串拆分成不同的部分并根据不同的特征对它们进行排序时遇到了问题。让我解释一下!
string = "Avititapin Kora 100 mg Coated tablet"字符串将始终由三个部分组成,尽管会发生变化。"Avititapin“是产品的名称,每次我在不同的文件上运行脚本时,它都会发生变化。"Kora“也是如此,它是名字的延伸,有时是名字的一部分,有时不是。字符串的下一部分我想分开是"100毫克“。这表明了产品的强度,这也会改变。然而,"mg"-part几乎永远不会改变,它将始终是一个数字(不是真正的整数或浮点数,因为它在字符串中)。我使用此代码以"mg“为指导来分隔(或拆分)字符串(以使其更适用于不同的字符串集合),但它只打印"mg”之后的字符串的其余部分。
string = "Avititapin Kora 100 mg Coated tablet"
mg = "mg"
after_mg = string[string.index(mg) + len(mg):]
print(after_mg)有人能告诉我如何编写代码,让我将字符串排序为三个不同的部分,并将它们分别存储为变量吗?
我想利用字符串中总是有数字的事实(就像这个产品100毫克一样)。我可以用“之前(数字) 100,100+(接下来的两个字母,在这个例子中是"mg"),然后"mg”之后的字符串的其余部分来写一些样式的东西,这也会改变,但我已经得到的代码可以使用它,所以我知道它至少是这样工作的。
我想我必须声明我对编程完全陌生,每一个建议或一点帮助都是非常有用和有用的!我是不是想错了,或者这实际上是可行的?
发布于 2021-06-28 04:15:13
正如@clubby789指出的,正则表达式是解决这个问题的好方法。然而,这种模式可能有点复杂。为了简单起见,我定义了一个函数来帮助提取您正在寻找的内容:
import re
def extract(line):
pattern = re.compile(r"(.*?)\s*(\d+[.]{0,1}\d*)\s*(mg|g)\s+(.*?)$")
result = pattern.match(line) # the entire match
name = result.group(1) # "Avititapin Kora"
amount = f"{result.group(2)} {result.group(3)}" # "100 mg"
dose_type = result.group(4) # "Coated tablet"
return name, amount, dose_type # return all 3 together每个group的结果都会添加到注释中。让我们来看看这个模式:
(.*?)\s*(\d+[.]{0,1}\d*)\s*(mg|g)\s+(.*?)$第一个(.*?)表示从字符串的开头开始捕获所有内容,直到我们遇到模式的下一部分,即
\s*(\d+[.]{0,1}\d*)这会显示match (但不要捕获到组中)第一部分(即\s*)后0个或更多空格。在括号中,( )是被捕获的内容。因此,(\d+[.]{0,1}\d*)说捕获空格后的所有数字,并可能捕获小数和更多的数字(即。允许整数和浮点数)。
下一步
\s*(mg|g)说匹配0或更多的空格,然后捕获你的单位。所以,如果你想添加kg,你可以用\s*(mg|g|kg)替换它。然后,在一个或多个空格之后,\s+捕获剩余的内容,直到一行的末尾:(.*?)$。
让我们测试一下:
test_data = """Avititapin Kora 100 mg Coated tablet
Avititapin 100 mg tablet
Avititapin Kora 100 g Coated tablet
Avititapin Kora 100.2 g Coated tablet
Avititapin Kora-24 100.2 g Coated tablet"""
for line in test_data.split("\n"):
print(extract(line))这将返回
('Avititapin Kora', '100 mg', 'Coated tablet')
('Avititapin', '100 mg', 'tablet')
('Avititapin Kora', '100 g', 'Coated tablet')
('Avititapin Kora', '100.2 g', 'Coated tablet')
('Avititapin Kora-24', '100.2 g', 'Coated tablet')发布于 2021-06-28 04:32:45
虽然我喜欢正则表达式,但我认为您的解决方案过于复杂了。因为它看起来是一个空格分隔的字符串,为什么不直接拆分()它,然后一次取一个片段,直到找到下一个字段。(顺便说一句:请不要使用string作为变量名,因为它是标准模块名)
mystring = "Avititapin Kora 100 mg Coated tablet"
wordlist = mystring.split()
product = ''
dosage = ''
comments = ''
product = wordlist.pop(0)
word = wordlist.pop(0)
while not word.isnumeric():
product += " "+word
word = wordlist.pop(0)
dosage = word
word = wordlist.pop(0)
if word in ["g","mg"]:
dosage += " "+word
word = wordlist.pop(0)
comments = ' '.join([word,*wordlist])
print (product, dosage, comments, sep='\n')此代码未经测试并手动键入,因此可能需要进行调整。
https://stackoverflow.com/questions/68154713
复制相似问题