SwiftyPyString 2.2.0

SwiftyPyString 2.2.0

ChanTsune维护。



  • 作者
  • ChanTsune

SwiftyPyString

Build Status Cocoapods carthage GitHub release Cocoapods platforms Swift Version

SwiftyPyString 是 Swift 的字符串扩展。
这个库提供了符合 Python 的字符串操作方法。

安装

CocoaPods

pod 'SwiftyPyString'

Carthage

github 'ChanTsune/SwiftyPyString'

Swift 包管理器

import PackageDescription

let package = Package(
    name: "YourProject",
    dependencies: [
        .package(url: "https://github.com/ChanTsune/SwiftyPyString.git", from: "\(version)")
    ]
)

使用方法

import SwiftyPyString

字符串扩展

字符串切片索引

let str = "0123456789"
str[0]
// 0
str[-1]
// 9

切片字符串

let str = "0123456789"

str[0,5]
// 01234
str[0,8,2]
// 0246
str[nil,nil,-1]
// 9876543210

使用切片对象示例

let str = "0123456789"
var slice = Slice(start:0, stop:5)
var sliceStep = Slice(start:0, stop:8, step:2)

str[slice]
// 01234
str[sliceStep]
// 0246

字符串乘法

var s = "Hello World! " * 2

// "Hello World! Hello World! "

方法

capitalize() 方法

"hello world!".capitalize() // "Hello world!"

casefold()

"ß".casefold() // "ss"

center(width [,fillchar])

"1234".center(10) // "   1234   "
"123"center(10) // "   123    "
"1234".center(10,fillchar:"0") // "0001234000"
"123"center(10,fillchar:"0") // "0001230000"

count(sub [,start [,end]])

"abc abc abc".count("abc") // 3
"aaaaaaaaaa".count("a", start:2) // 8
"bbbbbbbbbb".count("bb", end:8) // 4

endswith(suffix [,start [,end]])

"hello world!".endswith("!") // true
"hello world!".endswith("world!")  // true
"hello".endswith("world") // false
"hello".endswith(["hello","world","!"]) // true

expandtabs(tabsize=8)

"abc\tabc\t".expandtabs() // "abc        abc        "
"abc\tabc\t".expandtabs(4) // "abc    abc    "

find(sub [,start [,end]])

"123412312312345".find("123") // 0
"123412312312345".find("12345") // 10
"123412312312345".find("5") // 14
"123412312312345".find("31") // 6
"123412312312345".find("0") // -1

format(args...,kwargs)

发布后可用 v2.0

"{}, {}, {}".format("a", "b", "c") // "a, b, c"
"{0}, {1}, {2}".format("a", "b", "c") // "a, b, c"
"{0}{1}{0}".format("abra", "cad") // "abracadabra"
"{:,}".format(1234567890) // "1,234,567,890"

格式指定

https://docs.pythonlang.cn/3/library/string.html#format-specification-mini-language

format_map(kwargs)

发布后可用 v2.0

"{A}, {B}, {C}".format(["A": "a", "B": "b", "C": "c"]) // "a, b, c"
"{number:,}".format(["number":1234567890]) // "1,234,567,890"

格式指定

https://docs.pythonlang.cn/3/library/string.html#format-specification-mini-language

index(sub [,start [,end]]) throws

"123412312312345".index("123") // 0
"123412312312345".index("12345") // 10
"123412312312345".index("5") // 14
"123412312312345".index("31") // 6
"123412312312345".index("0") // throw PyException.ValueError

isalnum()

"123abc".isalnum() // true
"1000A".isalnum() // true
"日本語".isalnum() // true
"abc 123".isalnum() // false

isalpha()

"I have pen.".isalpha() // false
"qwerty".isalpha() // true
"日本語".isalpha() // true
"123".isalpha() // false
"".isalpha() // false

isascii()

"I have pen.".isascii() // trur
"qwerty".isascii() // true
"123".isascii() // true
"".isascii() // true
"非ASCII文字列".isascii() // false

isdecimal()

"123".isdecimal() // true
"12345".isdecimal() // true
"".isdecimal() // false
"".isdecimal() // false

isdigit()

"123".isdigit() // true
"12345".isdigit() // true
"".isdigit() // true
"".isdigit() // true

islower()

"lower case string".islower() // true
"Lower case string".islower() // false
"lower case String".islower() // false
"lower Case string".islower() // false
"小文字では無い".islower() // false

isnumeric()

"123".isnumeric() // true
"12345".isnumeric() // true
"".isnumeric() // true
"".isnumeric() // false

isprintable()

"".isprintable() // true
"abc".isprintable() // true
"\u{060D}".isprintable() // false

isspace()

" ".isspace() // true
"".isspace() // false
"Speace".isspace() // false

istitle()

"Title Case String".istitle() // true
"Title_Case_String".istitle() // true
"Title__Case  String".istitle() // true
"not Title Case String".istitle() // false
"NotTitleCaseString".istitle() // false
"Not Title case String".istitle() // false

isupper()

"UPPER CASE STRING".isupper() // true
"Upper Case String".isupper() // false
"大文字では無い".isupper() // false

join(iterable)

let array = ["abc","def","ghi"]
"".join(array) // "abcdefghi"
"-".join(array) // "abc-def-ghi"
"++".join(array) // "abc++def++ghi"

"abc".ljust(1) // "abc"
"abc".ljust(5) // "  abc"
"abc".ljust(5, fillchar:"$") // "$$abc"

"ABCDE".lower() // "abcde"
"あいうえお".lower() // "あいうえお"

"  lstrip sample".lstrip() // "lstrip sample"
"  lstrip sample".lstrip(" ls") // "trip sample"
"lstrip sample".lstrip() // "lstrip sample"

String.maketrans([97:"A",98:nil,99:"String"]) // ["a":"A","b":"","c":"String"]
String.maketrans(["a":"A","b":nil,"c":"String"]) // ["a":"A","b":"","c":"String"]
String.maketrans("abc",y: "ABC") // ["a":"A","b":"B","c":"C"]
String.maketrans("abc", y: "ABC", z: "xyz") // ["a":"A","b":"B","c":"C","x":"","y":"","z":""]

"a,b,c".partition(",") // ("a",",","b,c")
"a,b,c".partition("x") // ("a,b,c","","")

"abc".replace("bc", new: "bcd") // "abcd"
"Python python python python".replace("python", new: "Swift", count: 2) // "Python Swift Swift python"

"0123456789".rfind("0") // 0
"0123456789".rfind("02") // -1
"0123454321".rfind("2") // 8
"0123454321".rfind("1", end: -1) // 1

rindex(sub [,start [,end]]) 抛出异常

"0123456789".rindex("0") // 0
"0123456789".rindex("02") // throw PyException.ValueError
"0123454321".rindex("2") // 8
"0123454321".rindex("1", end: -1) // 1

rjust(width [,fillchar])

"abc".rjust(1) // "abc"
"abc".rjust(5) // "abc  "
"abc"rjust(5,fillchar:"z") // "abczz"

rpartition(sep)

"a,b,c".rpartition(",") // ("a,b", ",", "c")
"a,b,c".rpartition("x") // ("", "", "a,b,c")

rsplit(sep=nil [,maxsplit])

"a,b,c,d,".rsplit(",") // ["a", "b", "c", "d", ""]
"a,b,c,d,".rsplit() // ["a,b,c,d,"]
"a,b,c,d,".rsplit(",", maxsplit: 2) // ["a,b,c","d", ""]
"a,b,c,d,".rsplit(",", maxsplit: 0) // ["a,b,c,d,"]
"aabbxxaabbaaddbb".rsplit("aa", maxsplit: 2) // ["aabbxx", "bb", "ddbb"]

rstrip(chars=nil)

"rstrip sample   ".rstrip() // "rstrip sample"
"rstrip sample   ".rstrip("sample ") // "rstri"
"  rstrip sample".rstrip() // "  rstrip sample"

split(sep=nil [,maxsplit])

"a,b,c,d,".split(",") // ["a", "b", "c", "d", ""]
"a,b,c,d,".split() // ["a,b,c,d,"]
"a,b,c,d,".split(",", maxsplit: 2) // ["a", "b", "c,d,"]
"a,b,c,d,".split(",", maxsplit: 0) // ["a,b,c,d,"]
"aabbxxaabbaaddbb".split("aa", maxsplit: 2) // ["", "bbxx", "bbaaddbb"]

splitlines([keepends])

"abc\nabc".splitlines() // ["abc", "abc"]
"abc\nabc\r".splitlines(true) // ["abc\n", "abc\r"]
"abc\r\nabc\n".splitlines() // ["abc", "abc"]
"abc\r\nabc\n".splitlines(true) // ["abc\r\n", "abc\n"]

startswith(prefix [,start [,end]])

"hello world!".startswith("hello") // true
"hello world!".startswith("h") // true
"hello".startswith("world") // flase
"hello".startswith(["hello", "world", "!"]) // true

strip(chars=nil)

"   spacious   ".strip() // "spacious"
"www.example.com".strip("cmowz.") // "example"

swapcase()

"aBcDe".swapcase() // "AbCdE"
"AbC dEf".swapcase() // "aBc DeF"
"あいうえお".swapcase() // "あいうえお"

title()

"Title letter".title() // "Title Letter"
"title Letter".title() // "Title Letter"
"abc  abC _ aBC".title() // "Abc  Abc _ Abc"

translate(transtable)

let table = String.maketrans("", y: "", z: "swift")

"I will make Python like string operation library".translate(table)
// "I ll make Pyhon lke rng operaon lbrary"

upper()

"abcde".upper() // "ABCDE"
"あいうえお".upper() // "あいうえお"

zfill()

"abc".zfill(1) // "abc"
"abc".zfill(5) // "00abc"
"+12".zfill(5) // "+0012"
"-3".zfill(5) // "-0003"
"+12".zfill(2) // "+12"

更多详细信息请参见以下链接
https://docs.pythonlang.cn/3/library/stdtypes.html#string-methods

可切片协议

protocol Sliceable : Collection {
    init() /* Required. */
    subscript (_ start: Int?, _ stop: Int?, _ step: Int?) -> Self { get }
    subscript (_ start: Int?, _ end: Int?) -> Self { get }
    subscript (_ i:Int) -> Self.Element { get } /* Required. */
    subscript (_ slice: Slice) -> Self { get }
    mutating func append(_ newElement: Self.Element) /* Required. */
}

随着SwiftyPyString的引入,String遵循了Sliceable协议。

通过遵循Sliceable协议,它可以获取部分序列,如切片字符串中所述。

如果你想要遵循Sliceable的类型遵循了RangeReplaceableCollection,你可以通过定义subscript (_ i:Int) -> Self.Element { get }简单地使用它。

此外,如果Collection的关联类型IndexInt,你可以像下面这样使用极短的代码来遵循Sliceable,就像Array一样。

extension Array : Sliceable { }
let arr = [1, 2, 3, 4, 5]

arr[0, 3]
// [0, 1, 2]

let slice = Slice(step:2)

arr[slice]
// [1, 3, 5]

许可证

该项目遵循MIT许可证发行。有关更多信息,请参阅LICENSE文件。