如何在Python2.7中编写正则表达式,以返回字符串中的两个单词,并在它们之间加下划线
我有与此示例一致的字符串:如何在Python2.7中编写正则表达式,以返回字符串中的两个单词,并在它们之间加下划线,python,regex,string,Python,Regex,String,我有与此示例一致的字符串: >>> s = "plant yard !!@ blah HELLO OS=puffin_CuteDeer_cat_anteater" 每个字符串都有“OS=”表达式,其后半部分由下划线链接的单词组成。字符串的第一部分直到“OS=”为止,由下划线链接的实际单词在字符串中有所不同 我想用're'模块编写一个正则表达式,忽略字符串的第一部分直到模式部分,然后返回模式中的前两个单词,并在它们之间保持下划线 我想: >>> 'puffin
>>> s = "plant yard !!@ blah HELLO OS=puffin_CuteDeer_cat_anteater"
每个字符串都有“OS=”表达式,其后半部分由下划线链接的单词组成。字符串的第一部分直到“OS=”为止,由下划线链接的实际单词在字符串中有所不同
我想用're'模块编写一个正则表达式,忽略字符串的第一部分直到模式部分,然后返回模式中的前两个单词,并在它们之间保持下划线
我想:
>>> 'puffin_CuteDeer'
我可以摆脱第一部分,并且(我认为)正在接近处理模式部分。以下是我所拥有的和它所回报的:
>>> example = re.search('(?<=OS=)(.*(?=_))',s)
>>> example.group(0)
>>> 'puffin_CuteDeer_cat'
>>example=re.search(”(?您可以尝试以下方法:
import re
s = "plant yard !!@ blah HELLO OS=puffin_CuteDeer_cat_anteater"
s = re.findall('(?<=OS\=)[a-zA-Z]+_[a-zA-Z]+', s)[0]
下面使用捕获组(…)
和否定[^…]
来获取所需的部分:
>>> re.search(r'OS=([^_]+_[^_]+)', s).group(1)
'puffin_CuteDeer'
你可以做:
(?<=OS=)[^_]+_[^_]+
可能不需要正则表达式:
s = "plant yard !!@ blah HELLO OS=puffin_CuteDeer_cat_anteater"
right_side = s.split("=")[-1]
"_".join(right_side.split("_")[:2])
# 'puffin_CuteDeer'
哦,这很好用。非常感谢!现在我知道了如何为模式开发正确的表达式,我想也许\w可以替换[a-zA-Z]。我也会研究一下。再次感谢!@17thlvl植物学家很乐意帮忙!但是,您不想替换[a-zA-Z]
与\w
匹配,因为后者将与\u
匹配,因此\w+
在最后,在这种情况下,将找到河豚肉切食者
,这不是所需的输出。非常感谢您提供此选项。我认为这比re.findall更有效,因为我不需要生成列表。谢谢您的支持您对[^…]的善意解释。从文档中我无法理解。@17thlvl植物学家没问题:)谢谢。实际情况稍微复杂一点,我想避免列表的构建。我将把这一事实添加到原始问题中。是的,这就是为什么我认为Schwobasegll和heemayl提出的选项最终更适合我的目的。与@heemayl一样,我非常感谢这个答案和对t的解释他[^…]表达了自己的观点。
(?<=OS=)[^_]+_[^_]+
In [90]: s
Out[90]: 'plant yard !!@ blah HELLO OS=puffin_CuteDeer_cat_anteater'
In [91]: re.search(r'(?<=OS=)[^_]+_[^_]+', s).group()
Out[91]: 'puffin_CuteDeer'
s = "plant yard !!@ blah HELLO OS=puffin_CuteDeer_cat_anteater"
right_side = s.split("=")[-1]
"_".join(right_side.split("_")[:2])
# 'puffin_CuteDeer'