regex 如何匹配Python脚本中的字符串,只有当它们满足多个正则表达式模式时,然后让它只输出匹配的模式作为字符串[关闭]

vuktfyat  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(117)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

5天前关闭。
Improve this question
因此,我目前正在编写一个Python脚本,用于对研究项目的PDF中的一些数据进行排序,并将其输出为可以复制和粘贴到聚合中的字符串列表。我设法使它完成了输出所有条目的任务,从PDF复制和粘贴作为一个整洁的字符串列表,可以更容易地工作。这是完整的脚本:

from fileinput import close
import re

with open("C:\\Users\\buzzk\\Downloads\\New folder\\unsortedcats.txt") as input_file:
    text = input_file.readlines()

matches = []
with open("C:\\Users\\buzzk\\Downloads\\New folder\\sortedcats.txt", mode="wt") as output:
    for line in text:
        match = re.findall('^([A\-][0-9]{8} [\/\|\s|\w|\]*)([a-z0-9].+)', line)
        if match:
            matches.append(match[0])
            output.write(line + "\n")

id_number = re.compile('^([A\-][0-9]{8})')
intake_type = re.compile('( .....| ..... .........)$')
age_sex = re.compile('( [0-3]{1}m [0-9]+d [U|F|M|u|f|m]| [^y,m][0-9]+d [U|F|M|u|f|m])')
date = re.compile('( [0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4} )')
kittenstring = id_number.pattern + " " + age_sex.pattern + " " + date.pattern + " " + intake_type.pattern

if matches:
    with open("C:\\Users\\buzzk\\Downloads\\New folder\\sortedcatstringlist.txt") as input_file2:
        text2 = input_file2.readlines()
        
    matches2 = []
    with open("C:\\Users\\buzzk\\Downloads\\New folder\\kittens.txt", mode="wt") as output3:
        for line in text2:
            match2 = re.findall(kittenstring, line)
            if match2:
                matches2.append(match2[0])
                output3.write(line + "\n")

    if matches2:
        print("Kitten sorting successful.")
    else:
        print("Failed.")

现在,我正在努力使它输出的数据条目内的参数,我需要为这个特定的项目。这是10年的摄入量数据,每一只猫被带到当地动物收容所超过10年的时间,我只寻找3个月以下的猫谁是流浪或业主投降。我还想在排序的条目中包括摄入日期和ID号。
为此,我创建了三个独立的正则表达式模式:

#( [0-3]{1}+m [0-9]+d [U|F|M|u|f|m]| [^y,m][0-9]+d [U|F|M|u|f|m]) Age and Sex
#( .....| ..... .........)$ Intake type
#( [0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4} ) Date of intake
#^([A\-][0-9]{8}) ID number

我希望代码从输入文本文件中读取字符串,如下所示:

A20543469 Goldie Cat Domestic Shorthair/Mix 10d F Black/Orange N 7/24/2013 10:14 AM Stray
A20543663 Snowflake Cat Siamese/Mix 4y 11m 28d F White/Grey U 7/24/2013 10:30 AM Stray
A20543901 kitten 1 Cat Domestic Longhair/Mix 1m 25d U Yellow U 7/24/2013 10:44 AM Stray
A20543914 kitten 3 Cat Domestic Longhair/Mix 1m 25d U Grey/Black U 7/24/2013 10:44 AM Stray
A20543990 kitten 2 Cat Domestic Longhair/Mix 1m 25d U Yellow U 7/24/2013 10:44 AM Stray
A20544282 Cat Domestic Shorthair/Mix M White/Grey N 7/24/2013 11:04 AM Stray

仅当字符串满足所有三个参数时才匹配字符串,并且仅将指定的模式作为字符串写入输出文本文件中,如下所示:

A20543901 1m 25d U 7/24/2013 Stray

但是,它并没有这样做。我对Python没有经验,这是我的第一个项目,所以我不完全知道我做错了什么。我主要是尝试重复我的脚本第一次对PDF进行排序时所做的事情,但这种方法不起作用。剧本的第一部分很好,但第二部分不行。

nkcskrwz

nkcskrwz1#

问题一:
您的 kittenstring 模式不匹配提供的示例中的任何行,因为您希望匹配整行(在'^'和'$'之间),但要用单个空格(' ')连接部分模式,而部分模式之间还有其他字符。
试着调试你的整个模式。关于https://regex101.com/
最简单的解决方案是用'.*'连接部分模式,以匹配所需模式之间的任何字符串。

^([A\-][0-9]{8}).*( [0-3]{1}m [0-9]+d [U|F|M|u|f|m]| [^y,m][0-9]+d [U|F|M|u|f|m]).*( [0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4} ).*( .....| ..... .........)$

其他问题:
还要检查 age_sex 模式-在我看来,它错过了年龄的一部分,并且没有选择所需的线。我建议将文本转换为日期格式,然后过滤它。
为什么要将数据写入文件而不是直接使用它?你是否读取了正确的文件(sortedcatstringlist.txt来自哪里?))?

4ktjp1zp

4ktjp1zp2#

让我们从这样一个前提开始,在这种情况下,过滤我们不想要的行比过滤我们想要的行更容易。
因此,使用一些控制台命令,我们可以得到一个“干净”的 Dataframe ,作为适合操作的文本文件。

>pdftotext -table -nopgbrk cats2013.pdf cats2013.txt

>findstr /I "stray" cats2013.txt > strays-2013.txt&&find /C /I "stray" strays-2013.txt

---------- STRAYS-2013.TXT: 4722

>findstr /R "[0-9]d" strays-2013.txt > days+2013.txt

>findstr /R /V "[0-9]y" days+2013.txt > noyears2013.txt&&Find /C /I "stray" noyears2013.txt

---------- NOYEARS2013.TXT: 2084

>findstr /R /V "1[0-2]m" noyears2013.txt > no10-12m2013.txt

>findstr /R /V "[3-9]m" no10-12m2013.txt > Strays-0d-3m-2013.txt&&Find /C /I "stray" Strays-0d-3m-2013.txt

---------- STRAYS-0D-3M-2013.TXT: 1348

现在我们有了一个干净的列表,这是python或SED可以接管并删除条目之间的单行不需要的数据的地方。

A18831909 KITTY          Cat           Domestic Shorthair/Mix     1m 19d         F       Black            N            1/3/2013 10:54 AM Stray
A18885631                  Cat           Domestic Shorthair/Mix     2d             U       Black/White       U            1/10/2013 3:57 PM Stray
A18892478 Penny            Cat           Domestic Shorthair/Mix     1m 25d         U       Black/White       N            1/11/2013 2:38 PM Stray
A18894001 GEORGE           Cat           Domestic Shorthair/Mix     19d            M       Orange/White      N            1/11/2013 5:45 PM Stray
A18896963 silver tiger Cat                Domestic Shorthair/Mix     1m 11d         M       Black/Brown      N            1/12/2013 11:58 AM Stray
A18922061 JACK            Cat           Domestic Shorthair/Mix     1m 30d          M       Black/White      N            1/16/2013 11:22 AM Stray
A18922079 JILL            Cat           Domestic Longhair/Mix      2m 21d          F       Brown/White/     N            1/16/2013 11:22 AM Stray

现在控制台中的字符串拆分确实需要一个批处理文件,我们可以根据需要输出解析后的数据。

A19119685     1d F   2/9/2013 Stray
A19119688     1d U   2/9/2013 Stray
A19348544 1m  0d M   3/5/2013 Stray
A19348547 1m  5d M   3/5/2013 Stray
A19348550 1m  5d M   3/5/2013 Stray
A19348556 1m  5d F   3/5/2013 Stray
A19348568 1m  5d F   3/5/2013 Stray
A19348579 1m  5d F   3/5/2013 Stray
A19348586 1m  5d M   3/5/2013 Stray
A19348598 1m  5d M   3/5/2013 Stray
A19348609 1m  5d F   3/5/2013 Stray
A19354716 1m  0d F   3/6/2013 Stray
A19378241 1m  9d F   3/9/2013 Stray
A19378243 1m  9d F   3/9/2013 Stray
A19378247 1m  9d M   3/9/2013 Stray
A19378250 1m  9d M   3/9/2013 Stray
A19426057 2m  0d M  3/16/2013 Stray
A19463461 2m 18d F  3/22/2013 Stray
A19473556     1d M  3/23/2013 Stray
A19484698 1m 25d F  3/25/2013 Stray
A19492999     0d F  3/26/2013 Stray

这并不完美(我知道它会导致一些错误,因为字符检测不好)Python会更好,但它可以向您展示字符串处理的一个逻辑
parse.bat

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo. >result.txt
for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,* delims= " %%a in (STRAYS-0D-3M-2013.TXT) do (
set "ID=%%a"
set "MO=  "
set "_D=   %%d"& if !!_D:~-1!! == m set "MO=!!_D:~-2!!"
set "_E=   %%e"& if !!_E:~-1!! == m set "MO=!!_E:~-2!!"
set "_F=   %%f"& if !!_F:~-1!! == m set "MO=!!_F:~-2!!"
set "_G=   %%g"& if !!_G:~-1!! == m set "MO=!!_G:~-2!!"
set "_H=   %%h"& if !!_H:~-1!! == m set "MO=!!_H:~-2!!"
set "_I=   %%i"& if !!_I:~-1!! == m set "MO=!!_I:~-2!!"
if "!MO!" == "am" set "MO=  " 
if "!MO!" == "um" set "MO=  " 
set "DS=   "
set "_H=   %%h"&set "_I=   %%i"&set "_J=   %%j"&set "_K=   %%k"&set "_L=   %%l"&set "_M=   %%m"
set "_I=   %%i"& if !!_I:~-1!! == d (set "DS=!!_I:~-3!!"&set "SX=%%j"&set "DA=!!_M:~-10!!")
set "_H=   %%h"& if !!_H:~-1!! == d (set "DS=!!_H:~-3!!"&set "SX=%%i"&set "DA=!!_L:~-10!!")
set "_G=   %%g"& if !!_G:~-1!! == d (set "DS=!!_G:~-3!!"&set "SX=%%h"&set "DA=!!_K:~-10!!")
set "_F=   %%f"& if !!_F:~-1!! == d (set "DS=!!_F:~-3!!"&set "SX=%%g"&set "DA=!!_J:~-10!!")
set "_E=   %%e"& if !!_E:~-1!! == d (set "DS=!!_E:~-3!!"&set "SX=%%f"&set "DA=!!_I:~-10!!")
set "_D=   %%d"& if !!_D:~-1!! == d (set "DS=!!_D:~-3!!"&set "SX=%%e"&set "DA=!!_H:~-10!!")
echo !ID! !MO! !DS! !SX! !DA! Stray >>result.txt
)

相关问题