在python re中分隔字符串中的第一个单词

时间:2017-11-15 22:07:21

标签: python regex string

我需要将字符串分成两组;第一个单词和第二个单词或单词组。这些单词用下划线分隔,当我使用当前代码时,如果有多个下划线,它只会将最后一个分开。这是我目前的代码:

for record in reader:
s = record['trial']
patternsubgen = re.compile(r'(\w+)\(\w+\)\_(\w+)')
source = "Footit"
if patternsubgen.search(s):
    resultsubgen = patternsubgen.search(s)
    genussubgen = resultsubgen.group(1)
    speciessubgen = resultsubgen.group(2)
    subgen = '%s %s' % (genussubgen, speciessubgen)
    #print(subgen)
else:
    pattern = re.compile(r'(\w+)\_(\w+)')
    if pattern.search(s):
        result = pattern.search(s)
        genus = result.group(1)
        species = result.group(2)
        new = '%s %s' % (genus, species)
        print(new)

以下是字符串的一些示例:

Aphis(Aphis)_asclepiadis, Cinara_011, Clydesmithia_canadensis_1a,

我需要的是:

Aphis asclepiadis,
Cinara 011,
Clydesmithia canadensis_1a,

我得到的是:

Aphis asclepiadis,
Cinara 011,
Clydesmithia_canadensis 1a

4 个答案:

答案 0 :(得分:1)

代码

选项1

See regex in use here

(\w+?(?=[(_])).*?_(\w+)

替换

$1 $2

选项2

See regex in use here

([^_\W]+).*?[)_](\w+)

替换

$1 $2

结果

输入

Aphis(Aphis)_asclepiadis, Cinara_011, Clydesmithia_canadensis_1a,
Aphis(Aphis)test_asclepiadis, Cinara_011, Clydesmithia_canadensis_1a_test,

输出

选项1

Aphis asclepiadis, Cinara 011, Clydesmithia canadensis_1a,
Aphis asclepiadis, Cinara 011, Clydesmithia canadensis_1a_test,

选项2

Aphis _asclepiadis, Cinara 011, Clydesmithia canadensis_1a,
Aphis test_asclepiadis, Cinara 011, Clydesmithia canadensis_1a_test,

说明

选项1

  • (\w+?(?=[(_]))将以下内容捕获到捕获组1中
    • \w+?匹配一个或多个单词字符,但尽可能少
    • (?=[(_])肯定前瞻,确保后面的内容与集(_
    • 中的字符相匹配
  • .*?任意次数匹配任何字符,但尽可能少
  • _字面匹配下划线字符_
  • (\w+)将任何单词字符捕获一次或多次到捕获组2

选项2

  • ([^_\W]+)_以外的一个或多个单词字符捕获到捕获组1
  • .*?任意次数匹配任何字符,但尽可能少
  • [)_]按字面匹配)_
  • (\w+)将一个或多个单词字符捕获到捕获组2

答案 1 :(得分:1)

对于给定的字符串,您可以使用

\b([^_\W]+)(?:\([^()]+\))?_(\w+)\b

a demo on regex101.com

<小时/> 在Python

import re

strings = 'Aphis(Aphis)_asclepiadis, Cinara_011, Clydesmithia_canadensis_1a,'

rx = re.compile(r'\b([^_\W]+)(?:\([^()]+\))?_(\w+)\b')

strings = rx.sub("\g<1> \g<2>", strings)
print(strings)
# Aphis asclepiadis, Cinara 011, Clydesmithia canadensis_1a,

答案 2 :(得分:0)

已有很好的正则表达式答案。不过,您可以单独使用str.split来实现目标。它接受一个指定最大拆分数的参数:

records = ["Aphis(Aphis)_asclepiadis", "Cinara_011", "Clydesmithia_canadensis_1a"]

for record in records:
    left, right = record.split('_', 1) # Split no more than once.
    left = left.split('(')[0]          # Remove anything after '('
    print(' '.join([left, right]))
# Aphis asclepiadis
# Cinara 011
# Clydesmithia canadensis_1a

顺便说一下,你不应该在循环中调用re.compile。这是一项昂贵的操作,并且模式不会在记录之间发生变化。

答案 3 :(得分:0)

要求不够清晰,因此有些含糊不清的用例。但是看看你自己的代码和主题字符串,我提供了这样的正则表达式:

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

RegEx live demo

Python live demo

相关问题