Python 2.7: 使用正则表达式进行匹配

3
我有以下字符串:
asc_epsWarn_mu8                  # I want asc and epsWarn 
asc_ger_phiK_mi16                # I want asc and ger_Phik
ARSrt_FAC_RED5_DSR_AU16            # I want ARSrt and FAC_RED5_DSR    

基本上,我希望第一个_之前的字符在第一组中,第一个和最后一个下划线_之间的所有字符在第二组中。

我对正则表达式不熟悉。是否可能为所有上述字符串编写单个正则表达式?我能想到的最好的方法是:

(\w+)_(\w+)_(\w+)

但是它不起作用。什么正则表达式才是正确的?


1
抱歉。我会改变它。 - Anudocs
2
这个正则表达式是 ([^_]*)_(.*)_[^_\n]*$ 演示 - Pushpesh Kumar Rajwanshi
3个回答

4
你可以使用这个正则表达式,它有两个捕获组:
^([^_]+)_(.+)_[^_]*$

正则表达式演示

正则表达式细节:

  • ^:开头
  • ([^_]+):捕获组 #1 匹配 1 个或多个非下划线字符
  • _:匹配一个 -
  • (.+):捕获组 #2 匹配 1 个或多个任何字符,直到下一个匹配
  • _:匹配一个 -
  • [^_]*:匹配 0 个或多个非下划线字符
  • $:结尾

1
请解释一下这个正则表达式。 - Anudocs
1
我在答案中添加了详细的解释。 - anubhava
4
这个答案非常完美。 - Tim Biegeleisen

3

单词字符\w还包括下划线。

如果您想匹配不包含下划线的单词字符,可以使用反向字符类,并匹配不带下划线的非空白字符[^\W_]

您可以使用重复模式的两个捕获组来处理第二个组:

^([^\W_]+)_((?:[^\W_]+_)*)[^\W_]+$
  • ^ 字符串开始
  • ([^\W_]+)_ 将一个或多个单词字符(除下划线外)匹配到第一组中,然后匹配下划线
  • ( 捕获第二组
    • (?:[^\W_]+_)* 重复零次或多次,匹配一个或多个单词字符(除下划线外),然后下划线
  • ) 结束第二组
  • [^\W_]+ 匹配一个或多个单词字符(除下划线外)
  • $ 字符串结束

正则表达式演示


2
尝试使用这种模式:

最初的回答

([^_]+)_(.*)_.*

示例脚本:

input = "ARSrt_FAC_RED5_DSR_AU16"
matches = re.match(r'([^_]+)_(.*)_.*', input)
if matchObj:
    print "part1: ", matches.group(1)
    print "part2: ", matches.group(2)

part1:  ARSrt
part2:  FAC_RED5_DSR

以下是正则表达式的简要解释:

Original Answer翻译成"最初的回答"

([^_]+) match and capture the term before the first underscore
_       match a literal underscore
(.*)    then greedily match and consume everything up until the last undescore
_       match the last underscore
.*      consume the remainder of the string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接