我需要将大量的建筑代码从文本文件导入SQL数据库。到目前为止,我已经编写了以下代码,成功返回代码编号和标题。如何将代码标题后的文本与下一个代码的开头匹配?
Test.txt的:
101.1标题。这是一个示例代码。
101.1.2当地费用。当地管辖区可能会收取建筑许可证的费用 违反第300.1节。
import re
file=open(r'C:\Test.txt','r')
text=file.read()
codes=re.findall('(\d{3,4}.[\d.]+?){1}\s([\w\s]+[.]){1}',text)
for code in codes:
print code[0],code[1]
这导致:
101.1标题。 我想要代码[3] print'这是一个示例代码。'
101.1.2当地费用。
答案 0 :(得分:3)
使用re.split
代替re.findall
。在你的情况下:
>>> re.split('(\d{3,4}.[\d.]+?){1}\s([\w\s]+[.]){1}',text)
['', '101.1', 'Title.', ' This is an example code.\n\n', '101.1.2', 'Local Fees.', ' The local jurisdiction may charge fees for building permit violations per Section 300.1.\n']
答案 1 :(得分:0)
在我看来,你的记录标题是最后一个数字之间的文本(如果你在字符串字符上增加),第一个句号既不是数字也不是一个数字。
使用它可以获取整行并确定分隔记录的两个部分的句点的位置,并根据它进行分割。然后将两个字符串缓存为一对,或者直接将它们插入到数据库中。
如果您的文件只是您要提取的构建代码,并且不包含任何其他无用的数据,我建议您删除正则表达式并使用此方法。
答案 2 :(得分:0)
我会使用下面的内容(未经测试)
codes=re.findall('^(\d{3,4}.[\d.]+?)\s([\w\s]+[.])\s+(.*)$',text,re.MULTILINE)
请注意{1}无用
答案 3 :(得分:0)
import sys
import re
SECTION = r'\d{3,4}\.[\d.]*'
LABEL = r'[^.\r\n]*'
TITLE = re.compile(r'^({section})\s*({label})\W*'.format(section=SECTION, label=LABEL), re.MULTILINE)
def process(fname):
with open(fname, 'r') as inf:
txt = inf.read()
res = TITLE.split(txt)
it = iter(res)
it.next() # discard leading text
return zip(it, it, it)
def main():
args = sys.argv[1:] or ['c:/test.txt']
for fname in args:
res = process(fname)
# do something with res
if __name__=="__main__":
main()
针对您的test.txt运行,返回
[
('101.1', 'Title', 'This is an example code.\n\n'),
('101.1.2', 'Local Fees', 'The local jurisdiction may charge fees for building permit violations per Section 300.1.\n\n')
]