如何使用正则表达式从以任何大写字母开头的Pandas Series中提取字符串

时间:2019-05-24 03:59:56

标签: python regex pandas dataframe

我想将字符串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

您认为错在哪里?我已经从正则表达式页面和使用它的示例中进行了检查,但是当我使用上述代码时,这些方法不起作用。

4 个答案:

答案 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.

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改或更改。

enter image description here

RegEx电路

jex.im可视化正则表达式:

enter image description here

演示

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, _用在大写字母之后。