使用正则表达式导入大量数据

时间:2011-04-06 16:47:44

标签: python regex

我需要将大量的建筑代码从文本文件导入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当地费用。

4 个答案:

答案 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')
]