我需要将字符串分成两组;第一个单词和第二个单词或单词组。这些单词用下划线分隔,当我使用当前代码时,如果有多个下划线,它只会将最后一个分开。这是我目前的代码:
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
答案 0 :(得分:1)
(\w+?(?=[(_])).*?_(\w+)
替换
$1 $2
([^_\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,
(\w+?(?=[(_]))
将以下内容捕获到捕获组1中
\w+?
匹配一个或多个单词字符,但尽可能少(?=[(_])
肯定前瞻,确保后面的内容与集(_
.*?
任意次数匹配任何字符,但尽可能少_
字面匹配下划线字符_
(\w+)
将任何单词字符捕获一次或多次到捕获组2 ([^_\W]+)
将_
以外的一个或多个单词字符捕获到捕获组1 .*?
任意次数匹配任何字符,但尽可能少[)_]
按字面匹配)
或_
(\w+)
将一个或多个单词字符捕获到捕获组2 答案 1 :(得分:1)
对于给定的字符串,您可以使用
\b([^_\W]+)(?:\([^()]+\))?_(\w+)\b
<小时/>
在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+)