使用索引或Split函数拆分并使用字符串的不同部分



我在发现如何使用(即使可能(将字符串拆分为不同的部分并根据它们的不同特征进行排序时遇到了问题。让我解释一下!

string = "Avititapin Kora 100 mg Coated tablet"

字符串将始终由三部分组成,尽管会发生变化"Avititapin";是产品的名称,每次在不同的文件上运行脚本时都会更改。";Kora";,它是名称的扩展,有时可能是名称的一部分,有时可能不是。我想要分离的字符串的下一部分是";100mg";。这表明了产品的强度,这也会改变。然而;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"之后;mg";,这也改变了,但我已经得到的代码可以处理这个问题,所以我知道它至少是这样工作的。

我想我必须声明,我对编码完全陌生,每一条建议或每一点帮助都是令人难以置信的有用和认可!我是不是想错了,还是这真的可行?

正如@clubby789所指出的,regex是解决这个问题的好方法。然而,这种模式可能有点复杂。为了简单起见,我定义了一个函数来帮助提取你想要的东西:

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*)

这表示在第一部分(即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')

虽然我喜欢regex,但我认为您的解决方案过于复杂。由于它看起来是一个空格分隔的字符串,为什么不直接拆分((它,然后一次一个地处理这些片段,直到找到下一个字段。(顺便说一句:请不要使用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')

此代码未经测试,并且是手动键入的,因此可能需要进行调整。

最新更新