所以我正在尝试使用python 3.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测试仪确认了这个正则表达式(部分)。在此确认:https://regex101.com/r/kP4nO0/1 - 这与我希望匹配的匹配。因为它在测试器中工作,它应该在代码中工作,对吗?
(n.b。我从第一个打印命令的终端输出中复制了文本,然后用regex101的回车手动替换字符串中的\ n字符。)
一个可能的问题是python已将字节码标志(是小b,称为“标志?”)附加到字符串。这是我尝试将文本从utf-8转换为ascii的神器,我还没弄清楚如何让它消失。
然而,显然能够以该形式解析字符串。我知道这是因为我正在将两个文本文件从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
我能想到的唯一假设是,第一个破坏的正则表达式表达式是对换行符的组合以及字符串被视为字节对象,即使a)I知道正则表达式对换行符是正确的(因为,来自链接的regex101的确认),以及b)我知道它匹配字符串(因为,来自另一个字符串的成功匹配的确认)。
如果这是真的,我不知道该怎么办。
因此,问题:
1)我的假设是正确的,是新行和b
的组合会炸毁我的正则表达式吗?如果不是,那是什么?
2)我该如何解决这个问题?
a)用字符串中的内容替换换行符?
b)以某种方式重写正则表达式?
c)以某种方式摆脱b
并再次将其变为普通字符串? (工作原理)
谢谢!
加成
如果这是一个问题我需要修复上游,这里是我用来获取文本文件并转换为ascii的代码,替换非ascii字符:
此函数在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
答案 0 :(得分:1)
啊哈。我跟踪了它并回答了我自己的问题。显然,需要在解码的东西上调用某种编码方法。以下代码生成一个实际的字符串,其中包含换行符和所有内容(尽管现在我必须修复一堆其他错误,然后才能确定最终输出是否符合预期):
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?,但这表明确实如此。