我正在处理一个.ttl
文件,我收到的文件是容易理解的,其中一个问题是rdfs:seeAlso
的值没有被清理,它会破坏下游程序,我的意思是有如下形式的链接:
rdfs:seeAlso prefix:value_(discipline)
为了解决这个问题,我需要在特定字符前面加上\
,根据RDF 1.1 Turtle文档,对于出现的字符,我需要转义以下字符:
_, ~, -, !, $, &, (, ), *, +, =, ?, #, %
一开始我认为这很容易,于是我开始构建一个re.sub()
模式,尝试了很多可能的解决方案,但最接近的是:
re.sub(pattern=r"(rdfs\:seeAlso)(.{0,}?)([\_\~\-\!\$\&\(\)\*\+\=\?\#\%]{1})(.{0,})", repl='\\1\\2\\\\\\3\\4', string=str_of_ttl_file)
添加(rdfs\:seeAlso)
组件是为了防止意外更改作为rdfs:label
和rdfs:comment
示例的字符串中的字符(即''
或""
之间的任何上述字符)。
然而,这具有仅对第一次出现起作用的缺点,并且导致:
rdfs:seeAlso prefix:value\_(discipline)
它应该在的地方
rdfs:seeAlso prefix:value\_\(discipline\)
任何帮助或指导,这将是非常感谢!
编辑1:rdfs:label
和rdfs:comment
的示例是单引号('
)或双引号("
)之间的字符串,例如:
rdfs:label "example-label"@en
或者
rdfs:comment "This_ is+ an $example$ comment where n&thing should be replaced."@en
不需要替换其中的特殊字符,Turtle才能正常工作,因此正则表达式应将其保留。
3条答案
按热度按时间9lowa7mx1#
首先,你不需要对模式中
[...]
内的字符进行转义(-
应该是最后一个,否则in将被识别为range),这将使你的代码更具可读性,然后你可以在while循环中进行替换,并使用lookbehind来确保字符没有被转义:注意:对替换模式使用原始字符串会使其可读性更强
输出:
yrdbyhpb2#
我认为您应该分开检查字符串是否以
rdfs:seeAlso
和replacement开头。jexiocij3#
此解决方案 * 无需正则表达式 * 即可完成此操作: