Python正则表达式将字符串作为模式和返回数进行匹配
我有一些行表示文本文件中的一些数据。它们的格式如下:Python正则表达式将字符串作为模式和返回数进行匹配,python,regex,substring,match,Python,Regex,Substring,Match,我有一些行表示文本文件中的一些数据。它们的格式如下: s = 'TheBears SUCCESS Number of wins : 14' 它们都以名字开始,然后是空格和文本“成功的赢数:”,最后是赢数n1。有多个字符串,每个字符串具有不同的名称和值。我正在尝试编写一个程序,可以解析这些字符串中的任何一个,并返回数据集的名称和字符串末尾的数值。我正在尝试使用正则表达式来实现这一点,并得出以下结论: import re def winnumbers(s): pattern =
s = 'TheBears SUCCESS Number of wins : 14'
它们都以名字开始,然后是空格和文本“成功的赢数:”,最后是赢数n1。有多个字符串,每个字符串具有不同的名称和值。我正在尝试编写一个程序,可以解析这些字符串中的任何一个,并返回数据集的名称和字符串末尾的数值。我正在尝试使用正则表达式来实现这一点,并得出以下结论:
import re
def winnumbers(s):
pattern = re.compile(r"""(?P<name>.*?) #starting name
\s*SUCCESS #whitespace and success
\s*Number\s*of\s*wins #whitespace and strings
\s*\:\s*(?P<n1>.*?)""",re.VERBOSE)
match = pattern.match(s)
name = match.group("name")
n1 = match.group("n1")
return (name, n1)
重新导入
def winnumbers(个):
pattern=re.compile(r“”)(?P.*)#起始名称
\s*SUCCESS#空白和成功
\s*Number\s*of\s*wins#空格和字符串
\s*\:\s*(?P.*?“,re.VERBOSE)
匹配=模式。匹配
name=match.group(“name”)
n1=匹配组(“n1”)
返回(名称,n1)
到目前为止,我的程序可以返回名称,但问题是在那之后。他们都有“胜利数”的文字,所以我的想法是找到一种方法来匹配这个文字。但是我意识到我现在匹配精确子字符串的方法是不正确的。有没有办法将整个子字符串作为模式的一部分进行匹配?最近我读了很多关于正则表达式的书,但没有发现类似的东西。我对编程还是一个新手,我非常感谢任何帮助
最后,我将使用float()将n1作为一个数字返回,但我忽略了这一点,因为它现在没有正确地找到第一个数字,只会返回一个错误。请尝试以下方法:
((\S+)\s+SUCCESS Number of wins : (\d+))
结果如下:
>>> regex = re.compile("((\S+)\s+SUCCESS Number of wins : (\d+))")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0xc827cf478a56b350>
>>> regex.match(string)
<_sre.SRE_Match object at 0xc827cf478a56b228>
# List the groups found
>>> r.groups()
(u'TheBears SUCCESS Number of wins : 14', u'TheBears', u'14')
# List the named dictionary objects found
>>> r.groupdict()
{}
# Run findall
>>> regex.findall(string)
[(u'TheBears SUCCESS Number of wins : 14', u'TheBears', u'14')]
# So you can do this for the name and number:
>>> fullstring, name, number = r.groups()
>>regex=re.compile((\S+)\S+成功赢数:(\d+))
>>>r=regex.search(字符串)
>>>r
>>>regex.match(字符串)
#列出找到的组
>>>r.团体()
(u'TheBears成功获胜次数:14',u'TheBears',u'14')
#列出找到的命名字典对象
>>>r.groupdict()
{}
#跑芬德尔
>>>regex.findall(字符串)
[(u'TheBears成功获胜次数:14',u'TheBears',u'14')]
#因此,您可以对名称和编号执行以下操作:
>>>fullstring,name,number=r.groups()
如果您不需要完整的字符串,只需删除环绕括号。我认为这里实际上不需要使用正则表达式。因此,如果您可以接受以下代码,您可以使用它(请注意,我已经发布了它,这样您就可以拥有另一个选项): 或者,如果您确定所有单词都由单个空格分隔:
output={}
for line in text:
if 'success' in line.lower():
words = line.strip().split(' ')
output[words[0]] = words[-1]
如果中间的文本总是常数,则不需要正则表达式。内置的字符串处理函数将更高效,更易于开发、调试和维护。在这种情况下,您只需使用内置的
split()
函数获取碎片,然后根据需要清洁两个碎片:
>>> def winnumber(s):
... parts = s.split('SUCCESS Number of wins : ')
... return (parts[0].strip(), int(parts[1]))
...
>>> winnumber('TheBears SUCCESS Number of wins : 14')
('TheBears', 14)
请注意,我已将wins数输出为整数(假设这始终是一个整数),但如果需要,您可以轻松地将float()
-或任何其他转换函数替换为int()
编辑:显然,这只适用于单行-如果用多行调用函数,则会出现错误。要处理整个文件,我将使用map()
:
此外,我不确定这段代码的最终用途,但您可能会发现将输出作为字典使用更容易:
>>> dict(map(winnumber, open(filename, 'r')))
{'OtherTeam': 6, 'TheBears': 14}
您的问题是在正则表达式末尾使用
*?
。?
使其变为惰性,这意味着它将匹配尽可能少的字符,因此,如果以*?
结束正则表达式,它将不匹配任何字符。为您的n1
组去掉?
,或者在正则表达式的末尾添加一个$
,这样它将被强制匹配到行的末尾。是否删除?在n1组结束时,他们成功了!非常感谢你。我必须记住这一点,从现在起要更加小心。
>>> map(winnumber, open(filename, 'r'))
[('TheBears', 14), ('OtherTeam', 6)]
>>> dict(map(winnumber, open(filename, 'r')))
{'OtherTeam': 6, 'TheBears': 14}