只有在逗号前有数字时才计算元素
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+(?=,)|(?<=,)\d+').str.len()
?
.findall(r'\d+(?=,)|(?<=,)\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+
),后跟逗号或字符串结尾 ((?![^,])
= (?=,|$)
)
|
- 或
(?<=,)\d+
- 1 个以上的数字 (\d+
),前面有一个逗号 ((?<=,)
)。
查看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
警告1:is.digit()
不适用于带小数点的数字:
'3.14159'.isdigit()
False
Warning2:另外,请注意,千位分隔符将被拆分为不同的数值,并且会被计算多次。一百万,例如:
custom_count('1,000,000')
3
【讨论】:
我相信 OP 只希望最后一个字符是数字,而不是字符串本身。以上是关于只有在逗号前有数字时才计算元素的主要内容,如果未能解决你的问题,请参考以下文章
Java 只有数字,字母,下划线,横杆,英文逗号的正则表达式