精华内容
下载资源
问答
  • 目录 什么是正则表达式? Python如何支持正则? 1.邮箱 2. 身份证号 ...什么是正则表达式?...正则表达式(Regular Expression)通常被用来检索、替换那些符合...此处的Regular即是规则、规律的意思,Regular Expression

    目录

    什么是正则表达式?

    Python如何支持正则?

    1.邮箱

    2. 身份证号

    3. 国内手机号码

    4. 国内固定电话

    5. 域名

    6. IP地址

    7. 日期

    8. 国内邮政编码

    9. 密码

    10. 中文字符

    11. 数字

    12. 字符串

    附:正则表达式语法详解

    优先权


    什么是正则表达式?

    正则表达式(Regular Expression)通常被用来检索、替换那些符合某个模式(规则)的文本。

    此处的Regular即是规则、规律的意思,Regular Expression即“描述某种规则的表达式”之意。

    本文收集了一些常见的正则表达式用法,方便大家查询取用,并在最后附了详细的正则表达式语法手册。

    案例包括:「邮箱、身份证号、手机号码、固定电话、域名、IP地址、日期、邮编、密码、中文字符、数字、字符串」

    Python如何支持正则?

    我用的是python来实现正则,并使用Jupyter Notebook编写代码。

    Python通过re模块支持正则表达式,re 模块使 Python 语言拥有全部的正则表达式功能。

    这里要注意两个函数的使用:

    re.compile用于编译正则表达式,生成一个正则表达式( Pattern )对象;

    .findall用于在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

    # 导入re模块
    import re
    

    1.邮箱

    包含大小写字母,下划线,阿拉伯数字,点号,中划线

    表达式:

    [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)

    案例:

    pattern = re.compile(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)")
    
    strs = '我的私人邮箱是zhuwjwh@outlook.com,公司邮箱是123456@qq.org,麻烦登记一下?'
    result = pattern.findall(strs)
    
    print(result)
    
    ['zhuwjwh@outlook.com', '123456@qq.org']
    

    2. 身份证号

    xxxxxx yyyy MM dd 375 0     十八位

    • 地区:[1-9]\d{5}

    • 年的前两位:(18|19|([23]\d))       1800-2399

    • 年的后两位:\d{2}

    • 月份:((0[1-9])|(10|11|12))

    • 天数:(([0-2][1-9])|10|20|30|31)          闰年不能禁止29+

    • 三位顺序码:\d{3}

    • 两位顺序码:\d{2}

    • 校验码:[0-9Xx]

    表达式:

    [1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]

    案例:

    pattern = re.compile(r"[1-9]\d{5}(?:18|19|(?:[23]\d))\d{2}(?:(?:0[1-9])|(?:10|11|12))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]")
    
    strs = '小明的身份证号码是342623198910235163,手机号是13987692110'
    result = pattern.findall(strs)
    
    print(result)
    
    ['342623198910235163']
    

    3. 国内手机号码

    手机号都为11位,且以1开头,第二位一般为3、5、6、7、8、9 ,剩下八位任意数字
    例如:13987692110、15610098778

    表达式:

    1(3|4|5|6|7|8|9)\d{9}

    案例:

    pattern = re.compile(r"1[356789]\d{9}")
    
    strs = '小明的手机号是13987692110,你明天打给他'
    result = pattern.findall(strs)
    
    print(result)
    
    ['13987692110']
    

    4. 国内固定电话

    区号3~4位,号码7~8位

    例如:0511-1234567、021-87654321

    表达式:

    \d{3}-\d{8}|\d{4}-\d{7}

    案例:

    pattern = re.compile(r"\d{3}-\d{8}|\d{4}-\d{7}")
    
    strs = '0511-1234567是小明家的电话,他的办公室电话是021-87654321'
    result = pattern.findall(strs)
    
    print(result)
    
    ['0511-1234567', '021-87654321']
    

    5. 域名

    包含http:\\或https:\\

    表达式:

    (?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)

    案例:

    pattern = re.compile(r"(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)")
    
    strs = 'Python官网的网址是https://www.python.org/'
    result = pattern.findall(strs)
    
    print(result)
    
    ['https://www.python.org/']
    

    6. IP地址

    IP地址的长度为32位(共有2^32个IP地址),分为4段,每段8位,用十进制数字表示
    每段数字范围为0~255,段与段之间用句点隔开 

    表达式:

    ((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

    案例:

    pattern = re.compile(r"((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))")
    
    strs = '''请输入合法IP地址,非法IP地址和其他字符将被过滤!
    增、删、改IP地址后,请保存、关闭记事本!
    192.168.8.84
    192.168.8.85
    192.168.8.86
    0.0.0.1
    256.1.1.1
    192.256.256.256
    192.255.255.255
    aa.bb.cc.dd'''
    
    result = pattern.findall(strs)
    
    print(result)
    
    ['192.168.8.84', '192.168.8.85', '192.168.8.86', '0.0.0.1', '56.1.1.1', '192.255.255.255']
    

    7. 日期

    常见日期格式:yyyyMMdd、yyyy-MM-dd、yyyy/MM/dd、yyyy.MM.dd

    表达式:

    \d{4}(?:-|\/|.)\d{1,2}(?:-|\/|.)\d{1,2}

    案例:

    pattern = re.compile(r"\d{4}(?:-|\/|.)\d{1,2}(?:-|\/|.)\d{1,2}")
    
    strs = '今天是2020/12/20,去年的今天是2019.12.20,明年的今天是2021-12-20'
    result = pattern.findall(strs)
    
    print(result)
    
    
    ['2020/12/20', '2019.12.20', '2021-12-20']
    

    8. 国内邮政编码

    我国的邮政编码采用四级六位数编码结构
    前两位数字表示省(直辖市、自治区)
    第三位数字表示邮区;第四位数字表示县(市)
    最后两位数字表示投递局(所)

    表达式:

    [1-9]\d{5}(?!\d)

    案例:

    pattern = re.compile(r"[1-9]\d{5}(?!\d)")
    
    strs = '上海静安区邮编是200040'
    result = pattern.findall(strs)
    
    print(result)
    
    ['200040']
    

    9. 密码

    密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)

    表达式:

    [a-zA-Z]\w{5,17}

    强密码(以字母开头,必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)

    表达式:

    [a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}

    pattern = re.compile(r"[a-zA-Z]\w{5,17}")
    
    strs = '密码:q123456_abc'
    result = pattern.findall(strs)
    
    print(result)
    
    ['q123456_abc']
    
    pattern = re.compile(r"[a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}")
    
    strs = '强密码:q123456ABc,弱密码:q123456abc'
    result = pattern.findall(strs)
    
    print(result)
    
    ['q123456ABc,']
    

    10. 中文字符

    表达式:

    [\u4e00-\u9fa5]

    案例:

    pattern = re.compile(r"[\u4e00-\u9fa5]")
    
    strs = 'apple:苹果'
    result = pattern.findall(strs)
    
    print(result)
    
    ['苹', '果']
    

    11. 数字

    • 验证数字:^[0-9]*$

    • 验证n位的数字:^\d{n}$

    • 验证至少n位数字:^\d{n,}$

    • 验证m-n位的数字:^\d{m,n}$

    • 验证零和非零开头的数字:^(0|[1-9][0-9]*)$

    • 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$

    • 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$

    • 验证非零的正整数:^\+?[1-9][0-9]*$

    • 验证非零的负整数:^\-[1-9][0-9]*$

    • 验证非负整数(正整数 + 0) ^\d+$

    • 验证非正整数(负整数 + 0) ^((-\d+)|(0+))$

    • 整数:^-?\d+$

    • 非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$

    • 正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

    • 非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$

    • 负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

    • 浮点数 ^(-?\d+)(\.\d+)?$

    12. 字符串

    • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

    • 长度为3-20的所有字符:^.{3,20}$

    • 由26个英文字母组成的字符串:^[A-Za-z]+$

    • 由26个大写英文字母组成的字符串:^[A-Z]+$

    • 由26个小写英文字母组成的字符串:^[a-z]+$

    • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$

    • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$

    • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$

    • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

    • 可以输入含有^%&',;=?$\”等字符:`[^%&',;=?$\x22]+`

    • 禁止输入含有~的字符:[^~\x22]+

    附:正则表达式语法详解

    字符 描述
    \ 将下一个字符标记为一个特殊字符(File Format Escape,清单见本表)、或一个原义字符(Identity Escape,有^$()*+?.[{|共计12个)、或一个向后引用(backreferences)、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
    ^ 匹配输入字符串的开始位置
    $ 匹配输入字符串的结束位置
    * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
    ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”中的“do”和“does”。?等价于{0,1}。
    {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
    {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
    ? 非贪心量化(Non-greedy quantifiers):当该字符紧跟在任何一个其他重复修饰符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是「非」贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
    . 匹配除“\r”“\n”之外的任何单个字符。要匹配包括“\r”“\n”在内的任何字符,请使用像“(.\|\r\|\n)”的模式。
    (pattern) 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。可带数量后缀。
    (?:pattern) 匹配pattern但不获取匹配的子字符串(shy groups),也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符“(\|)”来组合一个模式的各个部分是很有用。例如“industr(?:y\|ies)”就是一个比“industry\|industries”更简略的表达式。
    (?=pattern) 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95\|98\|NT\|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
    (?!pattern) 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95\|98\|NT\|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
    (?<=pattern) 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95\|98\|NT\|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
    (?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95\|98\|NT\|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
    x\|y 没有包围在()里,其范围是整个正则表达式。例如,“z\|food”能匹配“z”或“food”。“(?:z\|f)ood”则匹配“zood”或“food”。
    [xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位(或末尾)则仅作为普通字符。右方括号应转义出现,也可以作为首位字符出现。
    [^xyz] 排除型字符集合(negated character classes)。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
    [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
    [^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
    [:name:] 增加命名字符类(named character class)中的字符到表达式。只能用于「方括号表达式」
    [=elt=] 增加当前locale下排序(collate)等价于字符“elt”的元素。例如,[=a=]可能会增加ä、á、à、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、ǎ、å、ǻ、ä、ǟ、ã、ȧ、ǡ、ą、ā、ả、ȁ、ȃ、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、ɑ 。只能用于方括号表达式。
    [.elt.] 增加排序元素elt到表达式中。这是因为某些排序元素由多个字符组成。例如,29个字母表的西班牙语, "CH"作为单个字母排在字母C之后,因此会产生如此排序“cinco, credo, chispa”。只能用于方括号表达式。
    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
    \B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
    \cx 匹配由x指明的控制字符。x的值必须为A-Za-z之一。否则,将c视为一个原义的“c”字符。控制字符的值等于x的值最低5比特(即对3210进制的余数)。例如,\cM匹配一个Control-M或回车符。\ca等效于\u0001, \cb等效于\u0002, 等等…
    \d 匹配一个数字字符。等价于[0-9]。注意Unicode正则表达式会匹配全角数字字符。
    \D 匹配一个非数字字符。等价于[^0-9]。
    \f 匹配一个换页符。等价于\x0c和\cL。
    \n 匹配一个换行符。等价于\x0a和\cJ。
    \r 匹配一个回车符。等价于\x0d和\cM。
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。注意Unicode正则表达式会匹配全角空格符。
    \S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
    \t 匹配一个制表符。等价于\x09和\cI。
    \v 匹配一个垂直制表符。等价于\x0b和\cK。
    \w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。注意Unicode正则表达式会匹配中文字符。
    \W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
    \xnn 十六进制转义字符序列。匹配两个十六进制数字nn表示的字符。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
    \num 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第num个用括号围起来的捕捉群(capture group)子表达式(subexpression)匹配。其中num是从1开始的十进制正整数,其上限可能是9、31、99,甚至无限。例如:“(.)\1”匹配两个连续的相同字符。
    \n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
    \nm 3位八进制数字,标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
    \nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
    \un Unicode转义字符序列。其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配著作权符号(©)。

    优先权

    优先权 符号
    最高 \
    ()(?:)(?=)[]
    *+?{n}{n,}{n,m}
    ^$、中介字符
    次最低 串接,即相邻字符连接在一起
    最低 \|
    展开全文
  • 没有看过上一篇的童鞋们,强烈推荐先读一下首次文身,应该选择什么部位?(脚踝篇) ——因为今天会提到的一些视觉原理,在上一篇里有详细的讲解。老样子,所有图片出处见水印。锁骨篇先说结论:锁骨也是我比较推荐...

    c882e7e1f6e4ad1a76ad08871fa1c4b0.png

    没有看过上一篇的童鞋们,强烈推荐先读一下首次文身,应该选择什么部位?(脚踝篇) ——因为今天会提到的一些视觉原理,在上一篇里有详细的讲解。

    老样子,所有图片出处见水印。


    锁骨篇

    先说结论:锁骨也是我比较推荐做第一个文身的位置。

    我所认为的“适合成为第一个”的文身,必须拥有以下几个特征:

    • 不太大
    • 不太疼(因为面积小/图案简单/部位不敏感)
    • 必要的时候能藏住,想显也能露出来
    • 最好自己能看到

    锁骨几乎满足每一项,除了最后一条得照镜子,稍微麻烦点。

    88e847f07cfd052680248c49f5f2cf4f.png

    再说说缺点:

    • 比较适合女生,男生做会比较娘气
    • 万一做得不好,就只有用很大的图(胸花)来盖了。

    总的来说,选对了文身师,锁骨会是个非常nice的选择~

    605712bebcfcffe73707bd1e639743ee.png

    来说说坑:什么样的锁骨文身是难看的呢?

    “视觉舒适”这个概念在上一篇首次文身,应该选择什么部位?(脚踝篇)里有详细讲解,再次提醒没读过的童鞋一定要先去看呐~

    我们先来看看颈部以下、胸部以上有几个视觉中心。

    对于胸部丰满的人来说,两个:肩球体块和锁骨视平线。再往下就是胸部体块了。

    9a4e256b6f4cc72e327a6b02629cb4b2.png

    但对于大部分普通亚洲女性来说,胸部容易比较平,不会像上图那样丰满。。。于是还会多一个前胸视觉空间,这个空间以下才是胸部:

    cf4b95400041316208ebd1843de287b8.png

    没错,前胸视觉中心的面积就是这么大~

    想要一个位置的文身视觉舒适,通常需要文身的面积覆盖整个视觉中心。这就是文身师们所说的“大胸花”了:

    0134cab1666d8cc2970d1241c3c02854.png

    胸花我们以后再谈,我提这个例子的意思是——在锁骨下方做文身,如果不是紧贴着锁骨视平线,只要稍微靠下一点,实际上就做到了前胸视觉中心。

    严格地说,这种已经不属于锁骨文身了,而属于“做在前胸的小图”。我在前两篇文章中说过,如果一个文身做在大体块上、同时面积又小于它所在的体块,就会有“突兀感”,因为小图打破了这个视觉中心,造成了“视觉不舒适”。

    比如像这样的:

    888fc27be27faff62d3124acaafa9644.png

    它破坏了整体的视觉效果,所以不太好看:

    8d5f14069d5efb81b4de7546935d0abd.png

    同学们,要小心这种情况鸭!做锁骨文身,最怕的就是不小心和胸部混为一谈,把适合锁骨的形状做到了胸部体块,造成突兀难看的结果。


    那么,什么样的锁骨文身是“视觉舒适”的呢?

    有以下几种:

    1.线形

    566aeb4ae20fbf4a5291f49526249c3c.png

    有些人的锁骨倾斜比较厉害,会和视平线形成一个角度。

    视觉舒适的线形文身,应该是紧贴视平线的,而不是锁骨的边缘线。

    7a6883b1b68ee57ef63d72268f83b03d.png

    因为视平线同时符合“人体形”原理,所以视觉上流畅感会更好,比较大气。当大的视觉中心和小的有所交错时,跟着大的走通常会显得比较大气,而跟着小的则会显得小气。

    e242697fe610e7499b64ee4f6f3553ff.png

    对比下面两个图,是否跟视平线的左图显得比较大气、跟锁骨线的右图显得比较小气呢?

    74b065d6bc9ff040448e0849e80ea6bf.png

    2.雪糕筒形

    同时覆盖视平线+肩球体块。

    6d30753eed8755bbcdb3a74ab5d74cfb.png

    锁骨v形比较明显的人,比较适合做这种形状的文身,而锁骨比较平的,其实比较适合线形。

    9a7f41207dec8df8c1a9e70df062bc3d.png

    雪糕筒形的特征是从喉头开始,在肩球处散开;只要符合这个特征的,都是典型的雪糕筒形,比如下图这种:

    8708745745890e51d68bb11742c435ef.png

    3.人体形

    关于“人体形”的概念,在上一篇首次文身,应该选择什么部位?(脚踝篇)里有详细讲解。这个方法参考的是人体的走势,而不局限于肌肉体块的形状。

    228ed24351bba815803064159553e49b.png

    上图的视觉原理:

    5ad37c0214ef96acac2647c404de96dc.png

    不推荐以下几种形状的锁骨文身:

    1.圆形/接近圆形的一小块

    圆形是一个不适合锁骨视感的形状,而且很容易做到下方胸口,造成视觉上的突兀感。

    如果非常喜欢圆形的话,建议做在肩球位置,千万不要做到胸口。

    不舒服的圆形文身:

    835efbc101f9333b36352510a9c057e0.png

    肩球处会好很多:

    1261ed2849b14ff3de187c353176a588.png

    2.苍蝇

    指甲盖以下大小的mini小文身统称苍蝇,尤其是实心的,因为远看就像是一只苍蝇或者一颗大痣……苍蝇可以做在不重要的地方例如踝关节以下(《脚踝篇》里有讲过)。锁骨由于离脸近,是比较惹人注目的位置,所以……如果一定要做苍蝇的话,请做成空心的/淡彩色的,至少让它不要过于显眼。

    8b8b9f5b4663ebe52283e271ceb7602c.png

    3.左右连接的线形

    左右连接的线形看似符合视平线,其实破坏了人体的中轴线(非常重要的视感)。记住,当大的视觉中心和小的有所交错时,跟着大的走。

    f3012b6190ab2dc9a9d4654428e2c076.png

    4.圆弧形

    过于绵软。圆弧形想要好看,势必是要通过大面积+锋利的骨干去平衡形状本身的绵软无力感的,如下图。

    7bd02f83286577f5472bb8caa32536ca.png

    而小文身是很难做到这一点的。没有了锐气,会显得很“肉”,这就是不推荐的理由。

    a121aa49297ebe7118521f09ab390055.png

    好了理论讲得差不多了~

    锁骨这个位置,其实比较复杂。每个人的锁骨形状都长得不太一样,有的很平,有的是v形……有的人肩球很明显有人不明显,有的人胸肌很发达有人完全没有……结构复杂的部位,可能性也很多,以上只是简单总结的视觉原理,具体问题还是要具体分析呦~


    我是文身艺术家补丁,毕业于清华美院。工作室位于上海。

    我的作品:微博:Sina Visitor System,ins:patch_tattoo_therapy

    公众号:补丁tattoo

    微信仅预约使用:patch_tattoo_therapy (除预约以外的其他事情,请通过知乎私信或微博留言,谢谢!)

    展开全文
  • 什么,你不知道祖安是什么意思?没关系,可以搜索词条啊,最近祖安确实进入了大众的视野,祖安文化在蔓延,本来不知道祖安的我好奇的搜索了一下祖安。 什么你以为我会给你科普一下祖安文化,交流祖安心得,我怎么...

            什么,你不知道祖安是什么意思?没关系,可以搜索词条啊,最近祖安确实进入了大众的视野,祖安文化在蔓延,本来不知道祖安的我好奇的搜索了一下祖安。

         什么你以为我会给你科普一下祖安文化,交流祖安心得,我怎么可能会和你来一次祖安思想的碰撞!

    所以这次我想说的是如何教你正确的使用搜索引擎,那么我们首先来举个例子,看组图片的对比,请看下面一组图片:这是第一张图----

     

    这是第二张图:

           很明显看出什么?如果没有请继续看下图,我搜索了一下头疼怎么办,你应该会更加明显。

           某度现在做的竞价实在是太恶心,搜索一个词条靠前几名都是广告,现在我用某度就是看下电脑是不是有网络,电脑网速怎么样!

          如果你能科学上网(翻墙),用梯子,最好还是用谷歌搜索引擎,毕竟谷歌(Do not be evil)不作恶,如果不行,一脚给你介绍一个国内良心搜索引擎,不作恶,不追踪 

    多吉搜索: https://www.dogedoge.com/

    界面很简洁,申明我没有收广告钱,没做推广,这个确实很好用。

           写在最后,现在貌似获取知识的渠道途径有很多,各种各样的搜索引擎,各种网站,各种短视频,来一个很官方阐述,就似乎是权威了,我们貌似缺少了独立思考的一个过程,之前我们了解一个事情,认识一件事物,可能就是靠长辈传授,向人打听,而现在我们能轻松认识一个事情,科技确实改变了我们的生活,但是我们也会在里面迷失自己,搜索引擎或许不能帮助你改变什么,但是请保持理智的思考。若你有什么更加好用的搜索网站,不妨说出来一起交流学习。

    最近一段时间一直在更新公众号,这篇为我公众号内容,如果你恰好感兴趣请关注我的公众号,一起学习一起进步

    展开全文
  • 1,关于日志记录是开发中必...2,配置log4j文件:具体配置表示什么意思就不说了一看就明白 嘿嘿 log4j.rootCategory=DEBUG,stdlog,errorlog log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appe

    1,关于日志记录是开发中必不可少的知识,现在给大家详细说下如何记录日志信息;原理就不多说了看实际操作

    2,配置log4j文件:具体配置表示什么意思就不说了一看就明白 嘿嘿

    log4j.rootCategory=DEBUG,stdlog,errorlog


    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Threshold=ERROR
    log4j.appender.stdlog.File=d:/error.log
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} [%c{1}] - %m%n


    log4j.appender.stdlog=org.apache.log4j.RollingFileAppender
    log4j.appender.stdlog.Threshold=DEBUG,console
    log4j.appender.stdlog.File=d:/debug.log
    log4j.appender.stdlog.MaxFileSize=1024KB
    log4j.appender.stdlog.MaxBackupIndex=3
    log4j.appender.stdlog.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdlog.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p [%c{1}] - %m%n


    log4j.appender.errorlog=org.apache.log4j.RollingFileAppender
    log4j.appender.errorlog.Threshold=WARN
    log4j.appender.errorlog.File=d:/warn.log
    log4j.appender.errorlog.MaxFileSize=1024KB
    log4j.appender.errorlog.MaxBackupIndex=3
    log4j.appender.errorlog.layout=org.apache.log4j.PatternLayout
    log4j.appender.errorlog.layout.ConversionPattern=%d [%c{1}] - %m%n


    3,具体代码:

    Log4JLogger l = new Log4JLogger("log4j.properties"); //初始化日志驱动
    l.logDebug("--->dug记录");
    l.logError("日志正在记录...");
    l.logInfo("消息记录中...");
    try {
    Log4JLogger ll = null;
    ll.logDebug("---");
    } catch (Exception e) {
    l.logDebug(e, e.fillInStackTrace());
           l.logError(e,e.fillInStackTrace());
    }

    4,保存的日志信息:

    2013/01/24 16:51:03 ERROR [properties] - 日志正在记录...
    2013/01/24 16:51:03 INFO  [properties] - 消息记录中...
    2013/01/24 16:51:03 DEBUG [properties] - java.lang.NullPointerException
    java.lang.NullPointerException
    at ddm.DataDriverManager.showSysInfo(DataDriverManager.java:47)
    at ddm.DataDriverManager.main(DataDriverManager.java:20)
    2013/01/24 16:51:03 ERROR [properties] - java.lang.NullPointerException
    java.lang.NullPointerException
    at ddm.DataDriverManager.showSysInfo(DataDriverManager.java:48)
    at ddm.DataDriverManager.main(DataDriverManager.java:20)

    5,大功高成! 觉得可以的哥们儿希望给个好评!

    6,QQ群: 180258862

    展开全文
  • 什么感觉现在CSDN的博客编辑器也有点叛逆呢,总是不听话,看不到鼠标的位置,还有经常粘贴一些外面的文章进来的时候总是很难编辑...只是知道个大概的意思然后知道怎么使用(糊涂的用),现在终于明白了(什么也无法说...
  • 为了输出更好的内容,我就必须先输入更多的内容,于是我选择 Stack Overflow 作为学习的第一战线,毕竟很多大牛都在强烈推荐。本篇文章,我们来探讨一下访问量足足有 87+ 万次的问题——什么是“找不到符号”,它是...
  • 技术之路就是漫长的打怪升级,不断学习前人的踩坑经验才能提升自己,切忌闭门造车。所谓独乐乐不如众乐乐,强烈推荐以下公众号,让你的生活多点意思????,希望小伙伴们能在 coding 的路上...
  • 为了输出更好的内容,我就必须先输入更多的内容,于是我选择 Stack Overflow 作为学习的第一战线,毕竟很多大牛都在强烈推荐。本篇文章,我们来探讨一下访问量足足有 87+ 万次的问题——什么是“找不到符号”,它是...
  • 为了输出更好的内容,我就必须先输入更多的内容,于是我选择 Stack Overflow 作为学习的第一战线,毕竟很多大牛都在强烈推荐。本篇文章,我们来探讨一下访问量足足有 87+ 万次的问题——什么是“找不到符号”,它是...
  • 强烈推荐https://regexr.com/该网站。 使用该网站,查看表达式每一项是什么意思。很快就可以掌握正则了!!!从来没觉得正则是如此的简单! 好了。
  • 可能英文不是很方便,那就使用下面的中文版的快速查找 Linux 命令行命令,简直是好用的不行,必须强烈推荐,不仅仅是简单的告诉什么作用,还提供了学习教程,作为学习的教程是极好的。 Linu...
  • UML——四种关系

    万次阅读 热门讨论 2015-09-19 19:54:34
    强烈推荐一个大神的人工智能的教程:...他们又是什么意思呢?他们之间的区别是什么呢?我们一起来探讨一下吧! 【四种关系】 1.关联关系(Association) 关联关系是一种结构化的关系,...
  • 绝对不是念ppt,老师充分考虑到的你的数学功底很烂,从头到尾,用最简单的方式给你推导了一遍公式,垃圾如我,都能学会,强烈推荐。 平常上课,听听挺有意思的,一定要提前把老师的ppt打印下来,边听,边做标记,边...
  • UML——类图(二)

    万次阅读 热门讨论 2015-10-23 16:56:26
    最近在学习设计模式,设计模式共23个,现在还是小菜鸟的我看了那些代码根本不懂是什么意思,还好,每个设计模式都对应着相应的类图,啊哈,看了图之后再去理解设计模式是解决什么问题的果然简单了很多,类图是UML图...
  • 内容大纲先上一个思维导图^_^,顺便推荐一个在线画图的好工具(Process On),有兴趣的可以试下,非常好用,强烈推荐! 下面让我们细细研究各个条目的内涵。第1条:考虑用静态工厂方法代替构造器 优势1:静态工厂...
  • Groovy中那些神奇注解之Memoized

    千次阅读 2017-03-13 17:33:58
    PS:强烈推荐Groovyr官方文档,相当的详细,地址:http://www.groovy-lang.org/documentation.html,不用担心是英文,有点代码经验的,一看示例代码就知道是什么意思了。好了,闲话少说,第一个注解:...
  • 前几天,有个同学问我宏定义中的#和##都是什么意思啊,说实话,我也不知道,不知道怎么办,google啊!说实话,自己过去对宏定义还真没有深入了解,只会使用最简单的宏定义,自从学了C++之后,基本上都不用宏定义了,...
  • 八月英语——近朱者赤

    万次阅读 热门讨论 2016-08-27 21:46:15
    这个月接触了新的学习材料,小猪佩琪,这个材料看了三部了,虽然是动画,但是每一集都有新的东西,有的句子比较简单,很容易引起共鸣,有的词语之前是没有接触过的,但是根据画面也就可以猜出是什么意思。...
  • 工厂模式

    2013-09-04 18:09:29
    以前总是听老师讲工厂模式,当时不理解什么意思。今天早晨突然心血来潮,想研究一下工厂模式。发现一个不错的博文:[url]http://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html[/url]强烈推荐!!!...
  • 最近在学习吴恩达老师的深度学习–NLP部分课程时,对里面提到的Word Embedding 让我特别费解,完全不能明白是什么意思,经过这几天查阅大佬们的博客,今天终于搞明白是啥意思了,大佬们写的东西都非常好,非常全面,...
  • 如果没有的话强烈推荐一看。它为本文奠定了基础,下面我将假设你已经看过上篇文章。注:本文中含有大量动画,如果打印的话将会错过很多精彩内容。闲话少说,下面进入主题。先总结下,上次的内容主要分三块:术语,...
  • 2016.7.12 做题汇总! 打卡!

    千次阅读 2016-07-13 01:52:28
    poj 1386什么意思。。自行百度一下吧。是个欧拉路经典题。首先,我们把单词首尾建边。 这样就会出现一个图,而这个图必须联通的。这里我们就可以用并查集看是否联通,也可以用 dfs但是强烈 推荐并查集 因为 dfs不好...
  • 在开始实际的游戏循环之前,让我们先显示一些图片,使得我们能够得到一些尺寸的概念(不太清楚这句什么意思)。如果还没有看到线程更新屏幕的内容,强烈推荐先看一下(上篇博客) 在android上面显示图片非常的简单 ...
  • 记得上大学时有一个同学就向我强烈推荐看等王家卫的电影!当时第一次看的时候,愣是没看明白。看完脑子里只有四个字:什么东西?几年后,才知道原来大多数人第一遍都没看懂(包括林青霞拍完她也没明白这部电影什么...
  • 强烈推荐GOF的《设计模式》,不用看什么j2ee设计模式。GOF的书的确经典。看过之后,精神爽,身体棒,吃嘛嘛香! 命令模式的类图,网上到处都有! 一般包括:client,invoker,Command接口,具体的command实现,...
  •  首先就是为什么起这个名字,因为这是我当时看这本书时最大的感觉,是一种发自心里的想喊出来的感觉,那个时候我初次接触vc,当然对mfc更是一无所知,一直听说这是一本非常好的书,很多人都是强烈推荐,而且我也...
  •  “本书清晰地阐明了Kernighan与Ritchie的The C Programming Language一书中许多简略的地方,而且精彩地总结了C语言编程实践,强烈推荐!”  ——Yechiel M.Kimchi,以色列理工学院 目录: 第1章 声明和...
  •  “本书清晰地阐明了Kernighan与Ritchie的The C Programming Language一书中许多简略的地方,而且精彩地总结了C语言编程实践,强烈推荐!”  ——Yechiel M.Kimchi,以色列理工学院 目录: 第1章 声明和...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

强烈推荐什么意思