精华内容
下载资源
问答
  • 通过Django模型自省,可以轻松地在数据库字段中搜索和替换。 安装 用pip安装: $ pip install django-remplacer 设定值 在您的INSTALLED_APPS中包含替换器: INSTALLED_APPS = [ ..., remplacer, ..., ] 用法 ...
  • 在文件中搜索以及替换文本

    千次阅读 2020-10-23 09:37:43
    使用命令行简单地替换一个文件中的文本内容,并且生成一个新的自定义文件名的文件。这是我们平时工作中常见的一个小任务,下面的这一段小代码能够轻松地完成这个任务: import os import sys usage = "usage: %s ...

    使用命令行简单地替换一个文件中的文本内容,并且生成一个新的自定义文件名的文件。这是我们平时工作中常见的一个小任务,下面的这一段小代码能够轻松地完成这个任务:

    import os
    import sys
    usage = "usage: %s search_text replace_text [infilename [outfilename]]" % os.path.basename(
        sys.argv[0])
    
    if len(sys.argv) < 3:
        print usage
    
    else:
        stext = sys.argv[1]
        rtext = sys.argv[2]
        print "There are %s args " % len(sys.argv)
    
        if len(sys.argv) > 4:
            input = open(sys.argv[3])
            output = open(sys.argv[4], 'w')
    
            for s in input:
                output.write(s.replace(stext, rtext))
    
            input.close()
            output.close()
    

    当我们使用 “python cookbook_13.py 1 a test.txt new.txt” 命令行的时候,test.txt 中 1 会被替换成 a,并且替换后的内容写入到 new.txt 中。

    注意:infilename,outfilename 这两个参数没有的话,程序并不会报错,但是会输出类似 “There are ...” 的语句。如果命令行参数小于 3 的话,会输出 “usage:。。。”。

    展开全文
  • Python 字符串匹配、搜索替换

    千次阅读 2019-12-31 23:11:45
    文章目录字符串匹配、搜索替换字符串开头或结尾匹配str.startswith() str.endswith()用 Shell 通配符匹配字符串fnmatch() fnmatchcase()字符串匹配和搜索 字符串匹配、搜索替换 字符串开头或结尾匹配 ...

    字符串匹配、搜索及替换


    在处理字符串中,有时会需要定位字符串,然后对字符串进行相应的处理。

    字符串开头或结尾匹配


    对于字符串的检查,可以通过特定的文本模式进行匹配。在 Python 内置类型中也提供了 str.startswith()str.endswith() 方法对字符串进行开头或结尾的检查。

    str.startswith() 和 str.endswith()

    str.startswith()str.endswith() 是检查字符串开头或结尾的一个简单方法。例如文件的后缀,URL 跳转协议,示例如下:

    >>> filename = "string.txt"
    >>> filename.endswith('.txt')
    True
    >>> filename.startswith('file:')
    False
    >>> url = 'http://www.python.org'
    >>> url.startswith('http:')
    True
    

    如果要检查多种匹配的可能,可以提供一个元组,将所有的匹配项写入元组中,然后传给 startswith()endswith() 方法的第一个参数中:

    >>> import os
    >>> filenames = os.listdir('.')
    >>> filenames
    ['tools', 'list_links.txt', 'access_test.py', 'control_roll.py', 'access.log', 'data.xls']
    >>> [name for name in filenames if name.endswith(('.py', '.txt'))]
    ['list_links.txt', 'access_test.py', 'control_roll.py']
    >>> any(name.endswith('.py') for name in filenames)
    True
    

    这里需要说明的是startswith()endswith() 两个方法的第一个参数,如果是要传入多种匹配选项,需要传入的类型必须是 tuple,如果有 listset 类型的选项,可以使用 tuple() 方法将已有选项进行转换。

    上面提及的 startswith()endswith() 方法有一种替代的方法,就是切片操作,但是代码看起来会相对繁冗。示例如下:

    >>> filename = 'string.txt'
    >>> filename[-4:] == '.txt'
    True
    >>> url = 'http://www.python.org'
    >>> url[:5] == 'http:' or url[:6] == 'https:' or url[:4] == 'ftp:'
    True
    

    还有另外一种方法是通过正则表达式去实现,示例如下:

    >>> import re
    >>> url = 'http://www.python.org'
    >>> re.match('http:|https:|ftp:', url)
    <_sre.SRE_Match object; span=(0, 5), match='http:'>
    

    正则表达式方法放在这里,的确能够解决问题,但是有点大材小用。而且,Python 内置的 startswith()endswith() 方法,对于这种简单匹配运行会更快。

    用 Shell 通配符匹配字符串


    除了通过你内置类型的方法对字符串进行匹配,还可以使用 Unix Shell 中的常用的通配符(比如 *.pyDat[0-9]*.csv 等)去匹配字符串。

    fnmatch() 和 fnmatchcase()

    Python 提供的 fnmatch 模块就有两个函数 fnmatch()fnmatchcase() 可以用来实现这样的匹配。示例如下:

    >>> from fnmatch import fnmatch, fnmatchcase
    >>> fnmatch('string.txt','*.txt')
    True
    >>> fnmatch('string.txt','?ing.txt')
    False
    >>> fnmatch('string.txt','?tring.txt')
    True
    >>> fnmatch('Dat57.csv','Dat[0-9]*')
    True
    >>> names = ['Dat1.csv','Dat2.csv','config.ini','test.py']
    >>> [name for name in names if fnmatch(name, 'Dat*.csv')]
    ['Dat1.csv', 'Dat2.csv']
    

    但是需要注意的是 fnmatch() 函数,在使用不同的底层操作系统的大小写敏感规则是不同的。这里是因为这个函数中的形参都会使用 os.path.normcase() 进行大小写正规化,在 Linux,Mac 中,会原样返回;而在 Windows 中,这里会将字符转换为小写返回。示例如下:

    >>> # On Mac
    >>> fnmatch('string.txt', '*.TXT')
    False
    >>> # On Windows
    >>> fnmatch('string.txt', '*.TXT')
    True
    

    如果对于这个大小写敏感规则很在意的情况下,可以使用 fnmatchcase() 来替代。这个函数完全区分大小写。示例如下:

    >>> fnmatchcase('string.txt', '*TXT')
    False
    

    fnmatch() 函数匹配的能力介于简单字符串方法和正则表达式之间。如果在数据处理操作中,能够用简单通配符匹配的情况下,这是一个可以考虑的方案。

    如果需求中需要做文件名的匹配,建议使用 glob 模块中的方法。具体的使用方法可参考下面的官方文档:

    https://docs.python.org/3.6/library/glob.html

    字符串匹配和搜索


    如果需要匹配的字符串比较简单,通常情况下,需要调用基本字符串方法就可以。

    str.find()

    除了前面介绍的 str.endswith()str.startswith() 的方法,还有 str.find() 方法,这个方法用于查找匹配项第一次出现的位置,这些都能够实现简单的匹配搜索,示例如下:

    >>> text = 'yeah, but no, but yeah, but no, but yeah'
    >>> # 匹配开头或结尾
    ...
    >>> text.startswith('yeah')
    True
    >>> text.endswith('no')
    False
    >>> # 搜索第一次出现位置
    ...
    >>> text.find('no')
    10
    

    正则表达式及 re 模块


    对于一些复杂的匹配,则需要借助正则表达式1re 模块。

    re.match()

    下面举例简单介绍匹配数字格式的日期字符串,示例如下:

    >>> text1 = '11/27/2012'
    >>> text2 = 'Nov 27, 2012'
    >>> import re
    >>> # 简单匹配一个或多个数字
    ...
    >>> if re.match(r'\d+/\d+/\d+', text1):
    ...     print('yes')
    ... else:
    ...     print('no')
    ...
    yes
    >>> if re.match(r'\d+/\d+/\d+', text2):
    ...     print('yes')
    ... else:
    ...     print('no')
    ...
    no
    >>>
    

    re.compile()

    如果需要使用同个模式进行多次匹配,那么可以考虑将模式字符串编译为模式对象。re.compile() 提供编译正则表达式字符串,示例如下:

    >>> pattern = re.compile(r'\d+/\d+/\d+')
    >>> if re.match(pattern, text1):
    ...     print('yes')
    ... else:
    ...     print('no')
    ...
    yes
    >>> if re.match(pattern, text2):
    ...     print('yes')
    ... else:
    ...     print('no')
    ...
    no
    

    re.findall()

    match() 方法总是从字符串开始去匹配,如果查找字符串任意部分出现的位置,建议使用 findall() 方法代替。示例如下:

    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> pattern = r'\d+/\d+/\d+'
    >>> re.findall(pattern, text)
    ['11/27/2012', '3/13/2013']
    >>>
    

    有时候定义正则表达式的时候,会利用括号进行捕获分组。示例如下:

    >>> pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
    >>>
    

    捕获分组的用处主要是用于将每个组的内容提取出来,也对后续的处理进行备用。示例如下:

    >>> import re
    >>> pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
    >>> match_data = re.match(pattern,'11/27/2012')
    >>> match_data
    <_sre.SRE_Match object; span=(0, 10), match='11/27/2012'>
    >>> match_data.group(0)
    '11/27/2012'
    >>> match_data.group(1)
    '11'
    >>> match_data.group(2)
    '27'
    >>> match_data.group(3)
    '2012'
    >>> match_data.groups()
    ('11', '27', '2012')
    >>> month, day, year = match_data.groups()
    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> # 使用 findall(),注意返回的结果是列表里面包裹元组
    ... re.findall(pattern, text)
    [('11', '27', '2012'), ('3', '13', '2013')]
    >>> for month, day, year in re.findall(pattern, text):
    ...     print('{}-{}-{}'.format(year, month, day))
    ...
    2012-11-27
    2013-3-13
    

    re.finditer()

    findall() 方法会以搜索文本并以列表形式返回所有的匹配。如果想以迭代的方式返回匹配,可以考虑使用 re.finditer() 方法代替。

    re.finditer() 方法返回一个迭代器,方法是从左到右扫描字符串,按照找到匹配项的顺序返回,示例如下:

    >>> for match_data in re.finditer(pattern, text):
    ...     print(match_data.groups())
    ...
    ('11', '27', '2012')
    ('3', '13', '2013')
    

    综合上述,re 模块进行匹配和搜索文本,核心的步骤是先使用 re.compile() 将正则表达式字符串进行编译,然后根据需求使用 match()findall() 或者 finditer() 方法。

    一些建议: 编写正则表达式字符串的时候,通常会是 r'' 这种形式,这种使用原始字符串的做法,能够不用去解析反斜杠。如果不这样做的话,需要使用两个反斜杠,例如:(\\d+/\\d+/\\d+)

    注意事项: match() 方法仅仅检查字符串的开始部分, 匹配的结果可能并非期望的结果。示例如下:

    >>> pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
    >>> match_data = re.match(pattern, '11/27/2012abcdef')
    >>> match_data
    <_sre.SRE_Match object; span=(0, 10), match='11/27/2012'>
    >>> match_data.group()
    '11/27/2012'
    

    如果需要精确匹配,得在正则表达式以 $ 结尾,如下示例:

    >>> pattern = re.compile(r'(\d+)/(\d+)/(\d+)$')
    >>> re.match(pattern, '11/27/2012abcdef')
    >>> re.match(pattern, '11/27/2012')
    <_sre.SRE_Match object; span=(0, 10), match='11/27/2012'>
    >>>
    

    上面的代码并未匹配 11/27/2012abcdef,因为编译的正则表达式以 $ 结尾,说明必须精确匹配才会返回结果。

    如果仅仅是做一次简单的文本匹配/搜索操作的话,可以略过编译部分,但是,需要进行大量的匹配和搜索操作的话,最好先对正则表达式字符串进行编译,然后再重复使用。这样做的原因是不会消耗太多的性能 。

    字符串搜索和替换


    对于字符串的搜索时,有时候会对搜索的匹配项进行替换操作。

    str.replace()

    如果是简单的字面模式,可以直接用 str.replace() 方法,示例如下:

    >>> text = 'yeah, but no, but yeah, but no, but yeah'
    >>> text.replace('yeah', 'yep')
    'yep, but no, but yep, but no, but yep'
    >>>
    

    re.sub()

    对于复杂的模式,请使用 re 模块中的 sub() 函数。现在的需求是这样,将形式为 11/27/2012 的日期字符串改为 2012-11-27,下面的是实现的代码:

    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> import re
    >>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
    'Today is 2012-11-27. PyCon starts 2013-3-13.'
    

    sub() 函数中,第一个参数表示的是被匹配的模式,第二个参数表示的是替换模式。反斜杠数字,比如 \3 指向的是前面模式捕获分组的组号。

    如果打算用相同的模式做多次替换,同样可以考虑先编译再重复使用。

    re.subn()

    如果除了替换后的结果外,还需要知道进行了多少次替换,可以使用 re.subn() 来代替。比如:

    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
    >>> newtext, n = re.subn(pattern, r'\3-\1-\2', text)
    >>> newtext
    'Today is 2012-11-27. PyCon starts 2013-3-13.'
    >>> n
    2
    >>>
    

    以上就是本篇的主要内容。


    结语: 新年快乐!


    1. 可参考【正则表达式 笔记整理↩︎

    展开全文
  • 模糊搜索 我们经常需要在一个代码项目中模糊搜索一些文本,怎么办呢? Vim自带的搜索/可以搜索当前文件,但是项目有很多个文件需要一个插件来模糊搜索多个文件内容使用Ag.vim或者fzf.vim都可以很好地支持模糊搜索 ...

    模糊搜索
    我们经常需要在一个代码项目中模糊搜索一些文本,怎么办呢?
    Vim自带的搜索/可以搜索当前文件,但是项目有很多个文件需要一个插件来模糊搜索多个文件内容使用Ag.vim或者fzf.vim都可以很好地支持模糊搜索

    fzf与fzf.vim
    fzf是一个强大的命令行模糊搜索工具,fzf.vim集成到了vim里https://github.com/junegunn/fzf.vim

    
    ```handlebars
    使用Ag[PATTERN]模糊搜索字符串
    使用Files[PATH]模糊搜索目录
    
    
    ```cpp
    Plug 'junegunn/fzf.vim'
    
    :w
    :source %
    :PlugInstall
    

    搜索替换插件far.vim

    如果想要批量搜索替换,可以试试
    far.vim https://github.com/brooth/far.vim比如在重构代码的时候经常会用到

    :Far foo bar **/*.py
    :Fardo
    
    Plug 'brooth/far.vim'
    
    :source %
    :PlugInstall
    
    展开全文
  • 1、Linux上windows上使用sed命令区别 sed -i 's/12345/$rank_version/g' test.py #linux上 sed -i '' 's/12345/$rank_version/g' test.py #windows上必须加两个单引号 '' 否则会报这样的错 extra characters at ...

    1、Linux上和windows上使用sed命令区别

    sed -i 's/12345/$rank_version/g' test.py      #linux上
    sed -i '' 's/12345/$rank_version/g' test.py   #windows上必须加两个单引号 ''  否则会报这样的错  extra characters at the end of d command
    

    2、通过变量名称替换内容时

    rank_version=1122
    sed -i '' "s/1111/$rank_version/g" test.py   #window上
    sed -i "s/1111/$rank_version/g" test.py   #linux上

     

    展开全文
  • #coding=utf-8 __author__ = 'mac' #命令行运行此脚本时的参数...# sys.argv[1]表示一个参数python a.py,sys.argv[2]表示两个参数“python a.py test.txt,sys.argv[3]表示3个参数python a.py test.txt new.txt im
  • webpy框架

    千次阅读 2017-06-22 11:07:15
     djangowebpy都是python的web开发框架。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至...
  • linux 全局搜索 grep 查找、替换

    千次阅读 2017-11-17 22:48:26
    1. grep 递归搜索文本内容# grep -rn "ipmitool"参考: 1.grep
  • web.py 0.3 新手指南

    2014-10-26 15:12:33
    web.py 0.3 新手指南 ...如果你希望读完整个指南, 你需要安装Python, web.py, flup, psycopg2, Postgres (或者等价的数据库Python驱动)。 详细,可以查看 webpy.org. 如果你已经有了一个web.py项目,请
  • 在《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》重点介绍了几个搜索函数,除了搜索,re模块也提供搜索替换功能,这个就是re模块的sub函数。 二、 语法释义 调用语法:...
  • python 根据文件替换规则批量替换字符串 本贴为求助贴,非该专业人员,自己搞了很久都没有结果,望各位...爬了一些帖子明白需要建立一个字典,然后根据字典进行搜索替换。找到一个类似的程序脚本: def replace():...
  • str.split() re.split() string 对象的 split() 方法只适应于非常简单的字符串分割情形, 它不允许有多个分隔符或者是分隔符周围不确定的空格。 当需要更加灵活的切割字符串的时候,应该使用 re.split()方法: ...
  • dlib源码setup.py修改

    2019-04-02 20:37:30
    使用方法查看:...通过dlib源码编译python失败,通过修改setup.py后,配合cmakemingw进行编译dlib并生成python库。如果你想要其他的替换mingw,请文件搜索change this。
  • 在字符串中匹配指定的文本模式并替换 解决方案 对于简单的字面模式,直接使用 str.replace() 方法即可,比如: text = 'yeah, but no, but yeah, but no, but yeah' print(text.replace('yeah...
  • cython代码编译setup.py文件编写

    千次阅读 2020-06-11 01:22:42
    使用 Pyximport,导入 Cython .pyx文件就像它们是.py文件一样(使用 distutils 在后台编译构建)。这种方法比编写setup.py更容易,但不是很灵活。因此,如果您需要某些编译选项,则需要编写setup.py。 手动运行...
  • python web.py详解

    千次阅读 2017-08-15 09:43:59
    那么web.py正好提供了一种简单的方法。 详细,可以查看官方文档:http://webpy.org/如果你已经有了一个web.py项目,请看看升级 页面的相关信息。准备开始。URL 处理任何网站最重要的部分就是它的URL结构。你的URL并...
  • web.py解释

    2016-09-15 22:37:36
    一个经典的web.py模块如下: 在开始你的web.py程序之前,打开一个文本文件(文件名为app.py)输入: import web 这条语句会导入web.py模块。 现在我们需要把我们的URL结构告诉web.py。让我从下面这个简单...
  • 我有这个文件结构(目录箭头文件之后):12model -> py_file.pyreport -> other_py_file.py主__init__.py:12import modelimport report模型目录:1import py_file报告目录:1import other_py_file现在在other_py_...
  • web.py处理url

    千次阅读 2014-01-09 16:51:21
    URL 处理  任何网站最重要的部分就是它的URL结构。你的URL并不仅仅只是访问者所能看到并且能发给朋友的。它还规定了你网站运行的心智模型。... web.py使这类强大的URL成为可能。 urls = ( '/', 'in
  • python 之web.py

    2014-11-23 22:32:40
    如果你希望读完整个指南, 你需要安装Python, web.py, flup, psycopg2, Postgres (或者等价的数据库Python驱动)。 详细,可以查看 webpy.org. 如果你已经有了一个web.py项目,请看看升级 页面的相关信息。 ...
  • far.vim-查找和替换Vim插件 介绍 Far.vim使得通过多个文件查找和替换文本更加容易。 它受IntelliJEclipse之类的精美IDE的启发,这些IDE为此类任务提供了舒适的工具。 安装 Plug ' brooth/far.vim ' 用法 使用命令...
  • 在python 2.7下面使用webpy框架

    千次阅读 2011-11-29 10:03:54
    如果你希望读完整个指南, 你需要安装Python, web.py, flup, psycopg2, Postgres (或者等价的数据库Python驱动)。 详细,可以查看 webpy.org. 如果你已经有了一个web.py项目,请看看升级 页面的相关信息。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,776
精华内容 9,510
关键字:

py的搜索和替换