Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中字符串的上下文相关拆分_Python_Regex_String - Fatal编程技术网

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