python中字符串的上下文相关拆分
道歉,如果这是多余的,但一个相当深入的搜索互斥发现没有任何相关的 我有一个来自(化学)数据库的字符串,其中分隔符(逗号)偶尔出现在我希望拆分的项目中。一个示例字符串是python中字符串的上下文相关拆分,python,regex,string,Python,Regex,String,道歉,如果这是多余的,但一个相当深入的搜索互斥发现没有任何相关的 我有一个来自(化学)数据库的字符串,其中分隔符(逗号)偶尔出现在我希望拆分的项目中。一个示例字符串是 s = '2-Methyl-3-phythyl-1,4-naphthochinon,Vitamin, K1,Antihemorrhagic vitamin' 在这种情况下,正确的拆分将产生 splitS = ['2-Methyl-3-phythyl-1,4-naphthochinon', 'Vitamin, K1', 'Anti
s = '2-Methyl-3-phythyl-1,4-naphthochinon,Vitamin, K1,Antihemorrhagic vitamin'
在这种情况下,正确的拆分将产生
splitS = ['2-Methyl-3-phythyl-1,4-naphthochinon', 'Vitamin, K1', 'Antihemorrhagic vitamin']
我相信我能设计的最准确的方法是在逗号上拆分,逗号旁边没有空格,并且没有两个数字包围。这会留下“1,4”和“Vitamin,K1”等实例,但会将字符串拆分为正确的3个化学名称
我尝试过使用RE,但没有成功。我可以发布一些我已经尝试过的东西,但它几乎是无用的。非常感谢你的帮助
编辑:本来应该包括这个。通过我的一些黑客攻击,以及@Borealid的更优雅的解决方案,我已经正确地识别了拆分的位置,但是得到了可怕的输出,例如
>>> s = '2-Methyl-3-phythyl-1,4-naphthochinon,Vitamin, K1,Antihemorrhagic vitamin'
>>> pat = re.compile("([^\d\s],[^\d\s])|([^\s],[^\d\s])|([^\d\s],[^\s])")
>>> re.split(pat, s)
['2-Methyl-3-phythyl-1,4-naphthochino', 'n,V', None, None, 'itamin, K', None, '1,A', None, 'ntihemorrhagic vitamin']
似乎应该有一种方法首先确定要拆分的正确逗号,然后只拆分逗号,从而避免名称被损坏
再次感谢类似于([^\d\s],^\d\s])|([^\s],^\d\s])|([^\d\s],^\s])之类的东西
逗号加((两侧的数字)或(尾部的数字但不在头部)或(头部的数字但不在尾部))”
在所有情况下,逗号旁边都没有空格
\d
是“数字”。\s
是“空白”。[]
是字符类-[^]
是反转字符类(“匹配不在后续内容中的字符”)
不会在字符串的第一个或最后一个位置拆分逗号,但我认为这不会引起关注。您可以通过使用来获得此行为,以便只匹配符合您解释的逗号:
(?<!\d),(?! )|(?<=\d),(?![\d ])
(?<!\d), # match a comma that is not preceeded by a digit...
(?! ) # ... as long as it is not followed by a space
| # OR
(?<=\d), # match a comma that is preceeded by a digit...
(?![\d ]) # ... as long as it is not followed by a digit or a space
(?
它似乎具有适合您的正确行为示例字符串:
>>> re.split(r'(?<!\d),(?! )|(?<=\d),(?![\d ])', s)
['2-Methyl-3-phythyl-1,4-naphthochinon', 'Vitamin, K1', 'Antihemorrhagic vitamin']
>>re.split(r'(?(?我有一个解决方案,但有点长。好了,我们开始:
s = '2-Methyl-3-phythyl-1,4-naphthochinon,Vitamin, K1,Antihemorrhagic vitamin'
首先,让我们查找字符串中所有逗号的所有位置(在所有逗号中)和所有特殊逗号的位置(在特殊逗号中)
其次,我们得到了这些位置的差异(在split_逗号中)
split_commas = set(all_commas) - set(special_commas)
然后,我们将迭代这些拆分位置,并将拆分的字符串保存在splitS
splitS = []
start = -1
for end in sorted(split_commas) + [None]:
splitS.append(s[start+1:end])
start = end
最后,这就是我们在拆分中得到的:
>>> splitS
['2-Methyl-3-phythyl-1,4-naphthochinon', 'Vitamin, K1', 'Antihemorrhagic vitamin']
当然有用-谢谢!现在,花一整天的时间来弄清楚它为什么有用…:@theFuriousNoob-看我的编辑,我添加了一些解释应该会有帮助。-只是为了检查我的理解:the(?\s
将匹配空格、制表符和换行符。我之所以使用空格字符,是因为您似乎仍然希望在'、…'
和'、…'
上拆分,但如果不是这样,您可以将空格字符替换为\s
或[\t]
。是的,您有正确的环视语法。
splitS = []
start = -1
for end in sorted(split_commas) + [None]:
splitS.append(s[start+1:end])
start = end
>>> splitS
['2-Methyl-3-phythyl-1,4-naphthochinon', 'Vitamin, K1', 'Antihemorrhagic vitamin']