跨多行将Python正则表达式转换为findall

跨多行将Python正则表达式转换为findall,python,regex,csv,screen-scraping,Python,Regex,Csv,Screen Scraping,在过去的一周里,我试图解决这个问题,但没有取得任何进展。非常感谢你们的帮助 我有1000个包含以下文本的文件: ,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,, Location:,,,ADDRESS_HERE_THAT I WANT BUT IT CAN ALSO BE ACROSS, MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES, AND IT ENDS AS ABRUPTLY,,,,,,,,,,,,, ,,,,,,,,,,

在过去的一周里,我试图解决这个问题,但没有取得任何进展。非常感谢你们的帮助

我有1000个包含以下文本的文件:

,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS,
MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES,
AND IT ENDS AS ABRUPTLY,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
但也有一些文件是这样写的

,,,,,,,,,,,,,,,,
Location:,,,ADDRESS,IS,IN,ONE,LINE,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
我需要在Python中使用正则表达式提取大写地址

从技术上讲,它是一个CSV文件,由一个非常旧的系统导出。它实际上无法作为CSV使用,因此我选择提取字符串,假设它是纯文本文件

我目前的代码是这样的,但是我已经尝试了很多其他的组合,却没有找到一个有效的解决方案

location = re.findall(r'^Location:,,,(.*),,,,,,,,,,,,,\n$|^Location:,,,(.*)[\n.*]{1,2,3,4,5,6},,,,,,,,,,,,,', CSV, flags=re.DOTALL | re.MULTILINE)
我离你很近吗?还是有更好的办法解决这个问题


非常感谢您的帮助。

这里有一个想法:您可以使用简单的循环来检测和提取多行位置数据

# Test data
TEXT=""",,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS,
MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES,
AND IT ENDS AS ABRUPTLY,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS,IS,IN,ONE,LINE,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
"""

in_location = False
tmp_location = None

def extract_location(l):
    global in_location
    global tmp_location
    if l.startswith("Location:"):
        in_location = True
        tmp_location = []
        # special case
        if l.endswith(',,,,,,,,,,,,,'):
            print(l[13:-13])
            in_location = False
        else:
            tmp_location.append(l[13:]) # Don't need 'Location:,,,'
    else:
        if in_location:
            tmp_location.append(l)
            if l.endswith(',,,,,,,,,,,,,'):
                # The end
                in_location = False
                res =  " ".join(tmp_location)
                print(res[0:-13])  # Remove trailing commas


def main():
    for line in TEXT.split("\n"):
        extract_location(line)


if __name__ == "__main__":
    main()
假设它被保存到名为
concept.py的文件中

$ python3 concept.py
DDRESS_HERE_THAT I WANT BUT IT CAN ALSO BE ACROSS, MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES, AND IT ENDS AS ABRUPTLY
DDRESS,IS,IN,ONE,LINE

鉴于您提供的虚拟数据:

s='',,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
地点:,,我要的地址在这里
但它也可以跨越,
多行,但不是一组特定的行,
然后它突然结束了,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
位置:,,地址,是,在,一,行,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,'''
您可以使用以下正则表达式:

matches=re.findall(r'Location:((?:[^,]*,){16}),s,flags=re.MULTILINE)
这就是比赛的样子:

打印('\n\n'.加入(匹配项)) ,,这里是我想要的地址 但它也可以跨越, 多行,但不是一组特定的行, 然后它突然结束,,,,,,,,,, ,,地址,是,在,一,行,,,,,,,,,
接下来要做什么取决于原始文件中逗号的含义。例如,您可能希望将其替换为空格:

addrs=[match.replace(',','').strip()用于匹配中的匹配]
看起来是这样的:

打印('\n\n'.加入(地址)) 在这里找到我想要的地址 但它也可以跨越 多行,但不是一组特定的行 它的结局也很突然 地址在一行
Python版本?python 2或3?在这种情况下,有比使用
re
更有效的解决方案。你对此持开放态度吗?我正在使用Python 3.7。是的,当然可以使用其他技术。经过两个星期的拔头发-什么都可以!除非您精通正则表达式并了解其限制,否则应用
re
通常不是一个好主意。查看每个文件是否仅包含一个地址?我觉得实际的示例数据将有助于更好地理解问题。(如果数据保护是一个问题,可能会更改一些单词或数字。)