用正则表达式分割多行

时间:2019-04-12 04:48:00

标签: python regex python-3.x

我正在尝试从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 .

文件中有多个类似上面的条目。

2 个答案:

答案 0 :(得分:1)

据我了解,您需要\s*;\s*

说明:

\s*-匹配空白字符零次或多次

;-从字面上匹配;

Demo

答案 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 1Regex 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。