Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式将字符串作为模式和返回数进行匹配_Python_Regex_Substring_Match - Fatal编程技术网

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}