Python 提取模式匹配

2024-12-26 08:43:00
admin
原创
104
摘要:问题描述:我正在尝试使用正则表达式来提取模式内的单词。我有一些像这样的字符串someline abc someother line name my_user_name is valid some more lines 我想提取这个词my_user_name。我做了类似的事情import re s = #tha...

问题描述:

我正在尝试使用正则表达式来提取模式内的单词。

我有一些像这样的字符串

someline abc
someother line
name my_user_name is valid
some more lines

我想提取这个词my_user_name。我做了类似的事情

import re
s = #that big string
p = re.compile("name .* is valid", re.flags)
p.match(s)  # this gives me <_sre.SRE_Match object at 0x026B6838>

我现在该如何提取my_user_name


解决方案 1:

您需要从正则表达式中捕获。search对于模式,如果找到,则使用检索字符串group(index)。假设执行了有效检查:

>>> p = re.compile("name (.*) is valid")
>>> result = p.search(s)
>>> result
<_sre.SRE_Match object at 0x10555e738>
>>> result.group(1)     # group(1) will return the 1st capture (stuff within the brackets).
                        # group(0) will returned the entire matched text.
'my_user_name'

解决方案 2:

您可以使用匹配组:

p = re.compile('name (.*) is valid')

例如

>>> import re
>>> p = re.compile('name (.*) is valid')
>>> s = """
... someline abc
... someother line
... name my_user_name is valid
... some more lines"""
>>> p.findall(s)
['my_user_name']

这里我使用re.findall而不是re.search来获取 的所有实例my_user_name。使用re.search,您需要从匹配对象的组中获取数据:

>>> p.search(s)   #gives a match object or None if no match is found
<_sre.SRE_Match object at 0xf5c60>
>>> p.search(s).group() #entire string that matched
'name my_user_name is valid'
>>> p.search(s).group(1) #first group that match in the string that matched
'my_user_name'

正如评论中提到的,您可能希望使您的正则表达式变得非贪婪:

p = re.compile('name (.*?) is valid')

只挑选'name '和下一个之间的内容' is valid'(而不是允许你的正则表达式挑选' is valid'你的组中的其他内容)。

解决方案 3:

你可以使用这样的方法:

import re
s = #that big string
# the parenthesis create a group with what was matched
# and 'w' matches only alphanumeric charactes
p = re.compile("name +(w+) +is valid", re.flags)
# use search(), so the match doesn't have to happen 
# at the beginning of "big string"
m = p.search(s)
# search() returns a Match object with information about what was matched
if m:
    name = m.group(1)
else:
    raise Exception('name not found')

解决方案 4:

您可以使用组(用'('和表示')')来捕获字符串的各个部分。group()然后,匹配对象的方法会为您提供组的内容:

>>> import re
>>> s = 'name my_user_name is valid'
>>> match = re.search('name (.*) is valid', s)
>>> match.group(0)  # the entire match
'name my_user_name is valid'
>>> match.group(1)  # the first parenthesized subgroup
'my_user_name'

在 Python 3.6+ 中,您还可以索引匹配对象,而不是使用group()

>>> match[0]  # the entire match 
'name my_user_name is valid'
>>> match[1]  # the first parenthesized subgroup
'my_user_name'

解决方案 5:

也许这个更简短并且更容易理解:

>>> import re
>>> text = '... someline abc... someother line... name my_user_name is valid.. some more lines'
>>> re.search('name (.*) is valid', text).group(1)
'my_user_name'

解决方案 6:

您想要一个捕获组。

p = re.compile("name (.*) is valid", re.flags) # parentheses for capture groups
print p.match(s).groups() # This gives you a tuple of your matches.

解决方案 7:

以下是不使用组来实现此目的的一种方法(Python 3.6 或更高版本):

>>> re.search('2ddd[01]d[0-3]d', 'report_20191207.xml')[0]
'20191207'

解决方案 8:

您还可以使用捕获组(?P<user>pattern)并像字典一样访问该组match['user']

string = '''someline abc

            someother line

            name my_user_name is valid

            some more lines
'''

pattern = r'name (?P<user>.*) is valid'
matches = re.search(pattern, str(string), re.DOTALL)
print(matches['user'])

# my_user_name

解决方案 9:

我通过谷歌找到了这个答案,因为我想将包含多个组的结果直接解包到多个变量中。虽然这对某些人来说可能是显而易见的,但对我来说却不是,因为我过去总是使用它,所以也许它可以帮助未来那些同样不知道的人。re.search()`group()`group*s*()

s = "2020:12:30"
year, month, day = re.search(r"(d+):(d+):(d+)", s).groups()

解决方案 10:

看起来您实际上是在尝试提取名称,而不是简单地找到匹配项。如果是这种情况,为您的匹配项设置跨度索引会很有帮助,我建议使用re.finditer。作为一种快捷方式,您知道name正则表达式的部分长度为 5,is valid长度为 9,因此您可以对匹配的文本进行切片以提取名称。

注意 - 在您的示例中,它看起来像是s带有换行符的字符串,因此下面假设如此。

## covert s to list of strings separated by line:
s2 = s.splitlines()

## find matches by line: 
for i, j in enumerate(s2):
    matches = re.finditer("name (.*) is valid", j)
    ## ignore lines without a match
    if matches:
        ## loop through match group elements
        for k in matches:
            ## get text
            match_txt = k.group(0)
            ## get line span
            match_span = k.span(0)
            ## extract username
            my_user_name = match_txt[5:-9]
            ## compare with original text
            print(f'Extracted Username: {my_user_name} - found on line {i}')
            print('Match Text:', match_txt)

解决方案 11:

以下是问题的简单解决方案

import re

except_substring = "w+_w+_w+"
original_string = """someline abc
someother line
name my_user_name is valid
some more lines"""

m=re.findall(except_substring, original_string)
if m:
    print(m[0]) #--> "my_user_name"
else:
    print("Substring was not found")

或者我们可以创建以下函数:

def replace_all_exept_substring(original_string: str, except_substring: str) -> str:

     """
     The function gets the substring to be skipped from the whole string
     can get it in the form of a single word, e.g. "NoSuchUser"
     or a regular expression, e.g. "Message.*has.been.*rejected."
     original_string : the whole phrase to search for
     except_substring : the phrase/word to be returned
     return : the message sent to the following e mail address has been rejected
     """
        
     m = re.findall(except_substring, original_string)
     # A+1 if A > B else A-1
     return m[0] if m else original_string

m=replace_all_exept_substring(original_string, except_substring)

print(m) #--> "my_user_name" or "original_string"
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用