正则表达式不够具体
Regex not specific enough
所以我为我的 Kindle e-reader 编写了一个程序来搜索我的高亮显示并删除重复的文本(通常是关于书名、作者、页码等的信息)。我认为它是功能性的,但有时在输出的某些行上会随机出现句点 (.)。起初我以为这个程序有问题,但后来我意识到我用来匹配书名和作者的正则表达式也匹配任何以方括号结尾的句子。
这是我用来检测书名和作者的正则表达式的代码
titleRegex = re.compile('(.+)\((.+)\)')
例子
- 所需的书名和作者匹配:书名(作者姓名)
- 还会匹配什么:*我喜欢苹果,因为它们是绿色的(有时它们也是红色的)。 *
在这种情况下,它会删除所有内容,只在句末留下句号。这显然不理想,因为它删除了我突出显示的文本
Here is the unformatted text file that goes into my program
该程序的工作原理是查找我编写的正则表达式的所有匹配项,遍历这些匹配项并用空字符串一一替换它们。
是否有任何方法可以使我的标题正则表达式更具体,以便它只选取作者的标题而不是括号中结尾的完整句子?如果没有,我必须采取什么步骤来重组这个程序?
我已将我的代码附加到此 post 的底部。我将非常感谢任何帮助,因为我是一个完全的编码新手。谢谢:)
import re
titleRegex = re.compile('(.+)\((.+)\)')
titleRegex2 = re.compile(r'\ufeff (.+)\((.+)\)')
infoRegex = re.compile(r'(.) ([a-zA-Z]+) (Highlight|Bookmark|Note) ([a-zA-Z]+) ([a-zA-Z]+) ([0-9]+) (\|)')
locationRegex = re.compile(r' Location (\d+)(-\d+)? (\|)')
dateRegex = re.compile(r'([a-zA-Z]+) ([a-zA-Z]+) ([a-zA-Z]+), ([a-zA-Z]+) ([0-9]+), ([0-9]+)')
timeRegex = re.compile(r'([0-9]+):([0-9]+):([0-9]+) (AM|PM)')
newlineRegex = re.compile(r'\n')
sepRegex = re.compile('==========')
regexList = [titleRegex, titleRegex2, infoRegex, locationRegex, dateRegex, timeRegex, sepRegex, newlineRegex]
string = open("/Users/devinnagami/myclippings.txt").read()
for x in range(len(regexList)):
newString = re.sub(regexList[x], ' ', string)
string = newString
finalText = newString.split(' ')
with open('booknotes.txt', 'w') as f:
for item in finalText:
f.write('%s\n' % item)
在没有上下文的情况下,没有足够的信息来判断“书名(图书作者)”是否不同于“我喜欢图书(好书)”之类的内容。值得庆幸的是,您显示的文本有很多上下文。您可以将它们组合成一个表达式来对该上下文进行编码,而不是创建多个不同的正则表达式。
例如:
quoteInfoRegex = re.compile(
r"^=+\n(?P<title>.*?) \((?P<author>.*?)\)\n" +
r"- Your Highlight on page (?P<page>[\d]+) \| Location (?P<location>[\d-]+) \| Added on (?P<added>.*?)\n" +
r"\n" +
r"(?P<quote>.*?)\n", flags=re.MULTILINE)
for m in quoteInfoRegex.finditer(data):
print(m.groupdict())
这将拉出文本的每一行,并对其进行解析,知道书名是等号之后的第一行,引文本身在其下方。
所以我为我的 Kindle e-reader 编写了一个程序来搜索我的高亮显示并删除重复的文本(通常是关于书名、作者、页码等的信息)。我认为它是功能性的,但有时在输出的某些行上会随机出现句点 (.)。起初我以为这个程序有问题,但后来我意识到我用来匹配书名和作者的正则表达式也匹配任何以方括号结尾的句子。
这是我用来检测书名和作者的正则表达式的代码
titleRegex = re.compile('(.+)\((.+)\)')
例子
- 所需的书名和作者匹配:书名(作者姓名)
- 还会匹配什么:*我喜欢苹果,因为它们是绿色的(有时它们也是红色的)。 *
在这种情况下,它会删除所有内容,只在句末留下句号。这显然不理想,因为它删除了我突出显示的文本
Here is the unformatted text file that goes into my program
该程序的工作原理是查找我编写的正则表达式的所有匹配项,遍历这些匹配项并用空字符串一一替换它们。
是否有任何方法可以使我的标题正则表达式更具体,以便它只选取作者的标题而不是括号中结尾的完整句子?如果没有,我必须采取什么步骤来重组这个程序?
我已将我的代码附加到此 post 的底部。我将非常感谢任何帮助,因为我是一个完全的编码新手。谢谢:)
import re
titleRegex = re.compile('(.+)\((.+)\)')
titleRegex2 = re.compile(r'\ufeff (.+)\((.+)\)')
infoRegex = re.compile(r'(.) ([a-zA-Z]+) (Highlight|Bookmark|Note) ([a-zA-Z]+) ([a-zA-Z]+) ([0-9]+) (\|)')
locationRegex = re.compile(r' Location (\d+)(-\d+)? (\|)')
dateRegex = re.compile(r'([a-zA-Z]+) ([a-zA-Z]+) ([a-zA-Z]+), ([a-zA-Z]+) ([0-9]+), ([0-9]+)')
timeRegex = re.compile(r'([0-9]+):([0-9]+):([0-9]+) (AM|PM)')
newlineRegex = re.compile(r'\n')
sepRegex = re.compile('==========')
regexList = [titleRegex, titleRegex2, infoRegex, locationRegex, dateRegex, timeRegex, sepRegex, newlineRegex]
string = open("/Users/devinnagami/myclippings.txt").read()
for x in range(len(regexList)):
newString = re.sub(regexList[x], ' ', string)
string = newString
finalText = newString.split(' ')
with open('booknotes.txt', 'w') as f:
for item in finalText:
f.write('%s\n' % item)
在没有上下文的情况下,没有足够的信息来判断“书名(图书作者)”是否不同于“我喜欢图书(好书)”之类的内容。值得庆幸的是,您显示的文本有很多上下文。您可以将它们组合成一个表达式来对该上下文进行编码,而不是创建多个不同的正则表达式。
例如:
quoteInfoRegex = re.compile(
r"^=+\n(?P<title>.*?) \((?P<author>.*?)\)\n" +
r"- Your Highlight on page (?P<page>[\d]+) \| Location (?P<location>[\d-]+) \| Added on (?P<added>.*?)\n" +
r"\n" +
r"(?P<quote>.*?)\n", flags=re.MULTILINE)
for m in quoteInfoRegex.finditer(data):
print(m.groupdict())
这将拉出文本的每一行,并对其进行解析,知道书名是等号之后的第一行,引文本身在其下方。