仅当元素在逗号前有一个数字时才对它进行计数

时间:2019-08-12 07:12:01

标签: python regex pandas numpy

仅当元素在逗号前有一个数字(末尾)时,我才尝试计数。

示例:

  

12,12,12 = 3
   BOOK ,, NO,06,07 = 5 <-应该是2
  401-402-403-404-405,301-302-303-304-305 = 2 <-这应该是10
  G2,G3,G4 <-应该是3

数据中包含各种特殊字符和东西,但我用逗号代替了“-”,似乎也造成了问题。一些书被分配了a-2,b-01,因此应该算作1,而不是2。我该怎么办?

代码:

import string
data['book_no']=data.book_no.replace(r'[!"#$%&\'()*+/.:;<>?@[\]^_`{|}~]', ',', regex=True)
data['book_no']=data.book_no.str.strip(string.punctuation);
data['total_books']=data.book_no.str.split(r'[!"#$%&\'()*+,/:;<>?@[\]^_`{|}~]').str.len()

2 个答案:

答案 0 :(得分:1)

您可以使用

data['total_books']=data['book_no'].str.findall(r'\d+(?![^,])|(?<=,)\d+').str.len()

正则表达式匹配

  • \d+(?![^,])-1个以上的数字(\d+)后跟逗号或字符串结尾((?![^,]) = (?=,|$)
  • |-或
  • (?<=,)\d+-1个以上的数字(\d+)前面带有逗号((?<=,))。

请参见regex demo和正则表达式图:

enter image description here

答案 1 :(得分:0)

我会尝试在每个破折号或逗号处分割,然后检查每个元素是否为数字。一种方法是:

def custom_count(your_string):
    split_str = your_string.replace('-', ',').split(',')
    return sum([x.strip().isdigit() for x in split_str])

这在您的示例中效果很好:

In [2]: custom_count('BOOK,,NO,06,07')
Out [2]: 2

In [3]: custom_count('401-402-403-404-405, 301-302-303-304-305')
Out [3]: 10

警告1 is.digit()不适用于带小数点的数字:

'3.14159'.isdigit()
False

警告2 :另外,请注意,数千个分隔符将被拆分为不同的数值,并将被计数多次。一百万,例如:

custom_count('1,000,000')
3