Python3正则表达式未找到已确认的匹配项

2024-09-28 01:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我尝试使用python3.4中的re模块(如果有必要的话,在运行mavericks的mac上)解析一堆文本文件中的引用。这里有一些最小的代码。请注意,有两个注释行:它们表示两个可选搜索。(很明显,小的一个r'Rawls'是有效的)

def makeRefList(reffile):
    print(reffile)
    # namepattern = r'(^[A-Z1][A-Za-z1]*-?[A-Za-z1]*),.*( \(?\d\d\d\d[a-z]?[.)])'
    # namepattern = r'Rawls'
    refsTuplesList = re.findall(namepattern, reffile, re.MULTILINE)
    print(refsTuplesList)

这个字符串很难看,所以我把它放在了一个要点上:https://gist.github.com/paultopia/6c48c398a42d4834f2ae

如前所述,搜索字符串r'Rawls'产生预期的输出['Rawls', 'Rawls']。但是,另一个搜索字符串只生成一个空列表。你知道吗

我已经用regex101测试仪确认了这个regex(部分)可以工作。在这里确认:https://regex101.com/r/kP4nO0/1——这个匹配我期望它匹配的东西。既然它在测试仪中工作,那么它应该在代码中工作,对吗?你知道吗

(注意,我从第一个print命令的终端输出复制了文本,然后用regex101的回车符手动替换字符串中的字符。)

一个可能的问题是python附加了字节码标志(小b称为“标志”吗?)到弦上。这是我尝试将文本从utf-8转换为ascii的产物,我还没有弄清楚如何使它消失。你知道吗

然而,re显然能够以这种形式解析字符串。我知道这一点,因为我正在将两个文本文件从utf-8转换成ascii,下面的代码在另一个字符串上运行得非常好,这个字符串是从另一个文本文件转换而来的,前面还有一个小b:

def makeCiteList(citefile):
    print(citefile)
    citepattern = r'[\s(][A-Z1][A-Za-z1]*-?[A-Za-z1]*[ ,]? \(?\d\d\d\d[a-z]?[\s.,)]'
    rawCitelist = re.findall(citepattern, citefile)
    cleanCitelist = cleanup(rawCitelist)
    finalCiteList = list(set(cleanCitelist))
    print(finalCiteList)
    return(finalCiteList)

上面代码正确匹配的另一段文本:https://gist.github.com/paultopia/a12eba2752638389b2ee

我能想到的唯一一个假设是,第一个被破坏的regex表达式在新行字符和被视为字节对象的字符串的组合上吐出,尽管a)我知道regex对于新行是正确的(因为,来自链接regex101的确认),b)我知道它与字符串匹配(因为,从另一个字符串的成功匹配中得到确认)。你知道吗

如果这是真的,我不知道该怎么办。你知道吗

因此,问题是:

1)我的假设正确吗,是新行和b的组合炸毁了我的正则表达式?如果没有,是什么? 2) 我该怎么修?
a) 用字符串中的内容替换换行符? b) 重写正则表达式? c) 以某种方式摆脱b并使它再次成为一个正常的字符串?(怎么做?)你知道吗

谢谢!你知道吗

添加

如果这是我需要在上游解决的问题,下面是我用来获取文本文件并转换为ascii的代码,替换非ascii字符:

在mavericks中textwrangler保存的utf-8.txt文件上调用此函数

def makeCorpoi(citefile, reffile):
    citebox = open(citefile, 'r')
    refbox = open(reffile, 'r')
    citecorpus = citebox.read()
    refcorpus = refbox.read()
    citebox.close()
    refbox.close()
    corpoi = [str(citecorpus), str(refcorpus)]
    return corpoi

然后对上面函数返回的列表的每个元素调用这个函数。你知道吗

def conv2ASCII(bigstring): 
    def convHandler(error):
        return ('1FOREIGN', error.start + 1)
    codecs.register_error('foreign', convHandler)
    bigstring = bigstring.encode('ascii', 'foreign')
    stringstring = str(bigstring)
    return stringstring

Tags: 字符串代码rereturndefasciiprint文本文件
1条回答
网友
1楼 · 发布于 2024-09-28 01:28:52

啊。我已经找到了答案并回答了我自己的问题。显然,需要对解码的东西调用某种编码方法。下面的代码生成了一个实际的字符串,其中包含换行符和所有内容,另一端(不过现在我必须先修复一堆其他错误,然后才能确定最终输出是否如预期的那样):

def conv2ASCII(bigstring): 
    def convHandler(error):
        return ('1FOREIGN', error.start + 1)
    codecs.register_error('foreign', convHandler)
    bigstring = bigstring.encode('ascii', 'foreign')
    newstring = bigstring.decode('ascii', 'foreign')
    return newstring

显然str()函数做不到同样的工作,原因对我来说很神秘。尽管这里有一个答案How to make new line commands work in a .txt file opened from the internet?表明确实如此。你知道吗

相关问题 更多 >

    热门问题