我想将字符串Series提取到一个新的Series中,该字符串仅包含以原始Series数据的大写字母开头的字符串。
我以前在熊猫系列中尝试过使用正则表达式,并且效果很好,因此我将其用作参考。下面的代码是我在当前问题中使用的代码。
harness['new'] = harness['Material'].str.extract('.*\-(.*)\-.*',expand=True)
下面的代码是我目前用来提取以大写字母开头的字符串的代码
In [63]:
batch1['Wire Name'].head()
Out[63]:
0 2HC31A20
1 HC30A20
2 2HC42A20
3 2HC5H20
4 HC4M20
In [64]:
batch1['Grouping'] = batch1['Wire Name'].str.extract('^[A-Z].*',expand=True)
batch1['Grouping'].head()
Out [64]:
ValueError: pattern contains no capture groups
我希望结果是:
0 HC31A20
1 HC30A20
2 HC42A20
3 HC5H20
4 HC4M20
您认为错在哪里?我已经从正则表达式页面和使用它的示例中进行了检查,但是当我使用上述代码时,这些方法不起作用。
答案 0 :(得分:1)
您的正则表达式应为“ [A-Z]。* ”。 ^ 将从字符串开头尝试匹配。
答案 1 :(得分:1)
感谢我的代码通过在主正则表达式之间添加括号来工作
In[63]:
batch1['Wire Name'].head()
Out[63]:
0 2HC31A20
1 HC30A20
2 2HC42A20
3 2HC5H20
4 HC4M20
Name: Wire Name, dtype: object
In [147]:
batch1['Grouping'] = batch1['Wire Name'].str.extract('([A-Z].*)',expand=True)
batch1['Grouping'].head()
Out[147]:
0 HC31A20
1 HC30A20
2 HC42A20
3 HC5H20
4 HC4M20
Name: Grouping, dtype: object
我不确定为什么我想用括号来选择要提取的正则表达式的哪一部分?
不是没有括号会得到相同的东西吗?
答案 2 :(得分:0)
在这里,我们可以简单地使用[A-Z]
作为左边界,然后向右滑动并收集其余的字符串,也许类似于:
(.+?)([A-Z].+)
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"(.+?)([A-Z].+)"
test_str = ("0 2HC31A20\n"
"1 HC30A20\n"
"2 2HC42A20\n"
"3 2HC5H20\n"
"4 HC4M20\n")
subst = "\\2"
# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
if result:
print (result)
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
如果不需要此表达式,可以在regex101.com中对其进行修改或更改。
jex.im可视化正则表达式:
const regex = /(.+?)([A-Z].+)/gm;
const str = `0 2HC31A20
1 HC30A20
2 2HC42A20
3 2HC5H20
4 HC4M20
`;
const subst = `$2`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
答案 3 :(得分:0)
您可以使用:
df = pd.DataFrame({'text': ['2HC31A20', 'HC30A20', '2HC42A20','2HC5H20', 'HC4M20']})
df['text'].str.extract(r'(^[A-Z][\w]+)', expand=False)
0 NaN
1 HC30A20
2 NaN
3 NaN
4 HC4M20
说明:
^[A-Z]
:这意味着只能以大写字母开头。
[\w]+
:这意味着将所有A-Z, a-z, 0-9, _
用在大写字母之后。