Как извлечь строку из серии Pandas, используя Regex, которая начинается с любой заглавной буквы - PullRequest
2 голосов
/ 24 мая 2019

Я хочу извлечь строковую серию в новую серию, которая содержит только строки, начинающиеся с заглавной буквы исходных данных серии.

Я уже пытался использовать регулярные выражения в серии панд, и это работало хорошо, поэтому я использую его в качестве ссылки. Код ниже - то, что я использовал в моей текущей проблеме.

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 ]

1 голос
/ 24 мая 2019

Спасибо, мой код работает путем добавления скобок между основными регулярными выражениями

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

Я не уверен, почему, хотя я думал, что скобки используются для выбора части регулярного выражения, которую мы хотим извлечь?

Разве без скобок результат будет тот же?

1 голос
/ 24 мая 2019

Ваше регулярное выражение должно быть " [AZ]. *". ^ попытается найти соответствие с начала строки.

0 голосов
/ 24 мая 2019

Вы можете использовать:

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, _ после заглавных букв.

0 голосов
/ 24 мая 2019

Здесь мы можем просто использовать [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 Circuit

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...