Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python在两个分隔符格式不同时提取两个分隔符之间的文本_Python_Regex_Text_Text Mining - Fatal编程技术网

使用Python在两个分隔符格式不同时提取两个分隔符之间的文本

使用Python在两个分隔符格式不同时提取两个分隔符之间的文本,python,regex,text,text-mining,Python,Regex,Text,Text Mining,我是一名新的Python程序员(在R方面有更多经验),使用Pycharm社区版v2019 2.4,使用运行Windows 10的笔记本电脑。我试图提取两个分隔符之间的文本块,通常采用以下格式。(文本位于分隔符之间,但在单独的行上) 我遇到的问题是,第7项和第7A项可能有许多不同的格式,例如,由于文本文件的初始预处理 Item 7. text Item 7A. 或 或 或 项目7和项目7A也可以出现在较大的文本块中。这是一个我无法控制的问题 到目前为止,我已经检查了100个文本文件,并编写

我是一名新的Python程序员(在R方面有更多经验),使用Pycharm社区版v2019 2.4,使用运行Windows 10的笔记本电脑。我试图提取两个分隔符之间的文本块,通常采用以下格式。(文本位于分隔符之间,但在单独的行上)

我遇到的问题是,
第7项
第7A项
可能有许多不同的格式,例如,由于文本文件的初始预处理

Item 7.  
text 
Item 7A.

项目7
项目7A
也可以出现在较大的文本块中。这是一个我无法控制的问题

到目前为止,我已经检查了100个文本文件,并编写了以下代码

import glob
import os
from os.path import isfile

path = filepath` 
for filename in glob.glob(os.path.join(path, '*.txt')):
     with open(filename) as f:
     data = f.read()

     x = re.findall(r'Item 7(.*?)Item 7A',data, re.DOTALL)
     "".join(x).replace('\n',' ')
     print(x)

     file = open('C:/R_Practice/dale1.txt', 'w')
     file.write(str(x))

     file.close()  
这涉及到一些,但不是所有的情况,即使这样,它也没有检测到所有的情况。无法分析全套文本文件,因为整个研究将有近250000个文本文件。我的问题如下

  • 是否有一个“catch all”代码可以搜索所有出现的分隔符,即使字符串的部分在单独的行上
  • 一旦识别出每个单独的文本块,是否可以将其写入硬盘上的单独文本文件
  • 是否可以编写一个日志文件,显示哪些文本文件未被处理,因为算法由于格式问题而“遗漏”了分隔符

  • 任何帮助都将不胜感激。

    请在
    项目
    7
    之间使用
    \s
    (这意味着任何类型的空格,包括换行符)

    import glob
    import os
    from os.path import isfile
    
    path = filepath
    for filename in glob.glob(os.path.join(path, '*.txt')):
       with open(filename) as f:
         data = f.read()
    
         x = re.findall(r'Item\s+7(.*?)Item\s+7A',data, re.DOTALL | re.IGNORECASE)
         #            here ___^^^   and ___^^^
         "".join(x).replace('\n',' ')
         print(x)
    
         file = open('C:/R_Practice/dale1.txt', 'w')
         file.write(str(x))
    
         file.close()  
    

    你的意思是使用像
    ^item\d+[a-Z]?[:.]((?:\r?\n(?!item\d.*)*)*)
    请重新格式化你的代码,此时它的格式不正确,无法处理。请尝试做一个例子。第四只鸟。我会试试这个正则表达式,看看会发生什么。如果你发送的正则表达式在同一行,不管是什么情况,都可以正常工作,但是我需要一些可以检查下一行的东西。如果“Item”和“7”之间有几个空格,Alsoit就不起作用。这段代码似乎可以捕获我需要的大多数情况,但我仍然无法将大小写设置为不敏感,并捕获字符串部分位于单独一行的情况。将进一步研究正则表达式,看看会发生什么。@Cerberus_64:添加不区分大小写的标志
    re.findall(r'Item\s+7(.*Item\s+7A',data,re.DOTALL | re.IGNORECASE)
    添加带有管道/或符号的re.IGNORECASE似乎效果很好。谢谢,这帮了大忙@Toto@Cerberus_64:不客气,很高兴有帮助,请随意将答案标记为已接受,
    ITEM 7 
    text  
    ITEM 7A:
    
    Item 
    7
    text
    Item 
    7A.
    
    import glob
    import os
    from os.path import isfile
    
    path = filepath` 
    for filename in glob.glob(os.path.join(path, '*.txt')):
         with open(filename) as f:
         data = f.read()
    
         x = re.findall(r'Item 7(.*?)Item 7A',data, re.DOTALL)
         "".join(x).replace('\n',' ')
         print(x)
    
         file = open('C:/R_Practice/dale1.txt', 'w')
         file.write(str(x))
    
         file.close()  
    
    import glob
    import os
    from os.path import isfile
    
    path = filepath
    for filename in glob.glob(os.path.join(path, '*.txt')):
       with open(filename) as f:
         data = f.read()
    
         x = re.findall(r'Item\s+7(.*?)Item\s+7A',data, re.DOTALL | re.IGNORECASE)
         #            here ___^^^   and ___^^^
         "".join(x).replace('\n',' ')
         print(x)
    
         file = open('C:/R_Practice/dale1.txt', 'w')
         file.write(str(x))
    
         file.close()