只有在逗号前有数字时才计算元素

Posted

技术标签:

【中文标题】只有在逗号前有数字时才计算元素【英文标题】:Count the element only if it has a number before comma 【发布时间】:2019-12-18 18:48:09 【问题描述】:

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

例子:

12,12,12 = 3 BOOK,,NO,06,07 = 5 401-402-403-404-405、301-302-303-304-305 = 2 G2,G3,G4

数据有各种特殊字符和东西,我用逗号代替了“-”,似乎也造成了问题。有些书被分配了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()

【问题讨论】:

我不明白为什么按照你的规则,最后一个应该是 10,而不是 2。 data['total_books']=data['book_no'].str.findall(r'\d+(?=,)|(?&lt;=,)\d+').str.len()? .findall(r'\d+(?=,)|(?&lt;=,)\d+').str.len() 是否适合您,或者您是否还想考虑- 分隔号码? @WiktorStribiżew 太棒了。它几乎是有效的,但对于这个“G2,G3,G4”它给出的输出为 2 但它应该是 3 但是G4不是数字,逗号后面没有数字。 【参考方案1】:

你可以使用

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

正则表达式匹配

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

查看regex demo 和正则表达式图:

【讨论】:

工作。惊人的知识渊博!【参考方案2】:

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

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

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

'3.14159'.isdigit()
False

Warning2:另外,请注意,千位分隔符将被拆分为不同的数值,并且会被计算多次。一百万,例如:

custom_count('1,000,000')
3

【讨论】:

我相信 OP 只希望最后一个字符是数字,而不是字符串本身。

以上是关于只有在逗号前有数字时才计算元素的主要内容,如果未能解决你的问题,请参考以下文章

C#怎么才能输入3个数字加个逗号

用正则表达式匹配数字——只有数字和逗号

如果逗号后面只有零,如何让逗号消失?

Java 只有数字,字母,下划线,横杆,英文逗号的正则表达式

要求做个java程序用户输入数字逗号隔开, 计算下面的公式 多谢了

如何在r中添加或减去逗号分隔的数字?