我正在尝试从ttl文档中拆分段的多行,这是相关代码。
entry_obj = str(Entry(*re.findall(r'([;\s]+[^\s+|\s+$])', ''.join(buf))))
yield process_entry_obj(entry_obj)
代码返回错误,并且由于无法拆分字符串,因此每次匹配参数的数量都不同,并且代码不会运行。
以下是我的文件格式:
File input
## http://www.example.com/abc#AAA
pms:ecCreatedBy rms:type ;
rmfs:lag "Ersteller"@newyork ,
"AAA"@wdc .
文件中有多个类似上面的条目。
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以使用
import re
s = "" # File contents
with open(filepath, 'r') as fr:
s =fr.read()
s = re.sub(r'(?m)(rmfs:label\s*)("[^"]*"@(?!en)\w*)(\s*,\s*)("[^"]*"@en) \.$', r'\1\4\3\2 .', s)
s = re.sub(r'(?m)^(\s*###\s*http.*/v\d+#)\w*((?:\n(?!\n).*)*rmfs:label\s*")([^"]*)("@en)', r'\1\3\2\3\4', s)
# Wrtie to file:
with open(filepath, 'w') as fw:
fw.write(s)
请参见Python demo。
这里是Regex 1和Regex 2 demos。
正则表达式1详细信息
(?m)
-多行模式,$
将与行尾匹配(rmfs:label\s*)
-第1组(\1
):rmfs:label
,然后是0+空格("[^"]*"@(?!en)\w*)
-第2组(\2
):"
,0个以上非"
字符,"@
,先行检查确保没有{{1 }}立即移到当前位置的右侧,然后输入0+个字符字符en
-第3组((\s*,\s*)
):\3
内含0+空格,
-第4组(("[^"]*"@en)
):\4
,除"
,"
和"
@en
-空格 .$
,行尾。正则表达式2详细信息
.
-多行mnode,(?m)
匹配行开始^
-一行的开头^
-第1组:0+个空格,(\s*###\s*http.*/v\d+#)
,0+个空格,###
,任意0+个字符,http
,1个以上数字和{{1 }} /v
-0个以上的字符字符#
-第2组:两次换行符(\w*
)之后的任意数量的行,然后是((?:\n(?!\n).*)*rmfs:label\s*")
,0+空格和(?:\n(?!\n).*)*
rmfs:label
-第3组:"
之外的0个以上的字符([^"]*)
-第4组:"
siubstring。