我正在尝试分离以下标题中的字符串,匹配名称和任何附加信息,无论是在括号/花括号中还是在破折号(常规、m/n破折号、水平线)之后。
正则表达式对我来说看起来很好,并且我能够在其他正则表达式测试器上测试它,但在Python中运行时却不起作用。
有几件奇怪的事情正在发生。第一个带破折号的标题似乎已经匹配了,但addition_a
组并没有包含正确的字符串。此外,由于某种原因,任何特殊字符(如各种破折号)都无法匹配。脚本的编码是utf-8,所以我认为原始正则表达式字符串中的破折号应该可以正常工作,但它们没有。
# -*- coding: utf-8 -*-
import re
titles = [
'Spaced (News)',
'Angry Birds [Game]',
'Cheats - for all games', # dash
'Cheats – for all games', # ndash
'Cheats — for all games', # mdash
'Cheats ― for all games' # horizontal bar
]
regex = re.compile(r'^(?P<name>.+)\s+(([-–—―]\s+(?P<addition_a>.+))|([\(\[](?P<addition_b>.+)[\)\]]))$')
for title in titles:
data = {}
match = regex.match(title.strip())
if match:
data['name'] = match.group('name')
try:
data['addition'] = match.group('addition_a')
except IndexError:
pass
try:
data['addition'] = match.group('addition_b')
except IndexError:
pass
print data
输出:
{'addition': 'News', 'name': 'Spaces'}
{'addition': 'Game', 'name': 'Angry Birds'}
{'addition': None, 'name': 'Cheats'}
{}
{}
{}